【问题标题】:List slicing given a specific range给定特定范围的列表切片
【发布时间】:2017-10-22 11:11:31
【问题描述】:

首先感谢您看到这个问题,请一定有更简单的方法来解决这个问题。 我有两个列表,我称之为 v1 和 v2,它们有不同的范围:

250-1100 和 900 1700

我想在 900-950 的范围内对它们进行切片。所以他们俩,应该把他们的下半部分切到最小值为900,上部分切到最大值为950。

注意:v1 和 v2 被双索引 [i][0] 引用,因为它们是数据对,我按第一个值对列表进行切片(它们实际上是 {x,y} 对)。

我有这个方法用来处理它:

def corte(v1, v2):  
    for i in range(len(v1)):
        if i == 0 and v1[0][0] == v2[0][0]:
            break
        if v1[i][0] >= v2[0][0]:
            v1 = v1[i:]
            break

    if i == len(v2) and v1[-1][0] == v2[-1][0]:
        return v1, v2

    if v1[-1][0] > v2[-1][0]:
        i = len(v1)
        while i > 0:
            i -= 1  
            if v1[i - 1][0] <= v2[-1][0]:
                v1 = v1[:i]
                break
    else:
        i = len(v2)
        while i > 0:
            i -= 1  
            if v2[i - 1][0] <= v1[-1][0]:
                v2 = v2[:i + 1]
                break
    return v1, v2

我最大的问题是处理这个范围的东西。我知道这太难理解了,而且这个问题似乎有点令人困惑,所以我要问的是一些建议,也许是你认为我应该尝试改进的任何方法。

示例:

V1=[[899.1,0],[900,0],[900.1,0],[920.0,0],[949.1,0],[950.1,0]]

v2=[[935,0],[945,0],[955,0]]

将返回 v=[900,0],[900.1,0],[920.0,0],[935,0],[945,0],[949.1,0]

第二个元素与问题无关。

编辑:实际上这段代码并没有将其切片到 900-950 范围内,当我将一个列表的边缘与另一个匹配时,它会删除多余的值。

【问题讨论】:

  • 您能发布一个示例输入和您想要的输出吗?
  • 可能更适合code-review。不过,请阅读他们的on-topic 页面以确保。
  • 您需要更好地解释自己。列表的“范围”是什么意思?没有这样的事情。这些值是否在列表列中?如果您的值是“实际上是 {x, y} 对”,那么您的代码到底与此有什么关系?你为什么要相互比较这些列表?看你的问题,这没有任何意义。
  • 更好:制作一个玩具示例来封装您所询问的内容。省略额外的索引、{x, y} 对等。
  • 我会看到有关放置示例输出的信息。我做了一个测试程序来做到这一点

标签: python list indexing slice


【解决方案1】:

我想这可以解决问题:

v1=[[899.1,0],[900,0],[900.1,0],[920.0,0],[949.1,0],[950.1,0]]
v2=[[935,0],[945,0],[955,0]]
v3 = v1+v2
v3.sort(key=lambda x: x[0])
final_list = [x for x in v3 if x[0]>900 and x[0]<950]
print(final_list)

1) 要合并两个列表,只需添加它们是最好的方法

list3 =list1+list2

2) 通过将键指定为列表的第一个元素来对列表进行排序

list_name.sort(key=lambda x: x[0])

3) 列表理解。

[x for x in v3 if x[0]>900 and x[0]

如果 x[0](列表列表的第一个元素)大于 900 且小于 950,则在 v3(列表列表)中存储每个 x(这里是列表)的 x。

【讨论】:

  • 这确实是我希望的那种解决方案,但是 Mark T 让我的问题变得更容易了,我将能够删除大量不必要的行。只有当我可以将它们都标记为正确时...
【解决方案2】:

如果您的目标是根据部分元素的值(例如,element[0])提取元素的子范围,请执行以下操作:

sublist1 = list(filter((lambda elt: 900 <= elt[0] <= 950), v1))

v2 也是如此。

【讨论】:

    【解决方案3】:

    您需要具体的输入和输出示例,但我认为您需要列表理解。例如,这将返回 v1 中的值,其中该对的第一个元素在 900-950 范围内。

    [pair for pair in v1 if 900 <= pair[0] <= 950]
    

    【讨论】:

    • 我会做一些测试,但我认为在将列表作为参数发送到方法之前使用列表进行测试可能会奏效。让我们看看...
    • 实际上它工作得很好,但我不明白代码是如何理解条件的,如果在那里需要它们,父代将如何工作?而python实际上用两个比较器理解条件?比如 1
    • @Breno 我不明白你的问题“如果那里需要括号,括号将如何工作?”。是的,1 &lt;= x &lt;= 2 相当于 Python 中的 1 &lt;= x and x &lt;= 2
    • 我做了一些研究,我明白了,当我说这句话时,我正在以一种算术的方式阅读这条线,请忽略那个哈哈。感谢您的帮助
    猜你喜欢
    • 2021-05-02
    • 2021-06-17
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多