从列表的末尾筛选元素

4

我有一个数据结构,长这样:

[(1, 2), (2, 3), (4, 0), (5, 10), (6, 0), (7, 0)]

仅过滤列表末尾第二个元素为0的元组的最佳方法是什么?
期望输出为:
[(1, 2), (2, 3), (4, 0), (5, 10)]

1
你是如何定义“列表的结尾”的?(6,0)不在列表的结尾。 - frickskit
4个回答

8
这听起来像你想要一个用于列表的`rstrip()`。你可以在while循环中使用`.pop()`:
while somelist and somelist[-1][1] == 0:
    somelist.pop()

这会直接修改列表。

如果要创建一个副本,你需要先找到一个切片终点,然后切片复制:

end = len(somelist)
while end and somelist[end - 1][1] == 0:
    end -= 1
newlist = somelist[:end]

1
In [355]: list(reversed(list(dropwhile(lambda x: x[1]==0, reversed([(1, 2), (2, 3), (4, 0), (5, 10), (6, 0), (7, 0)])))))
Out[355]: [(1, 2), (2, 3), (4, 0), (5, 10)]

1

我更喜欢@MartijnPieters提出的原地解决方案。

>>> L = [(1, 2), (2, 3), (4, 0), (5, 10), (6, 0), (7, 0)]
>>> i = next((i for i, (x, y) in enumerate(reversed(L)) if y != 0), 0)
>>> L[:-i]
[(1, 2), (2, 3), (4, 0), (5, 10)]

0
通过你的问题,我理解你只想删除第二个值为0的元素。如果这不是你的意思,我很抱歉。 如果你想永久地改变列表,你可以这样做:
myList = [(1, 2), (2, 3), (4, 0), (5, 10), (6, 0), (7, 0)]
for i in range(len(myList)):
    if myList[i][1] == 0:
        del myList[i]
return myList

或者如果您不想更改列表,可以这样做:

myList = [(1, 2), (2, 3), (4, 0), (5, 10), (6, 0), (7, 0)]
afterList = []
for i in myList:
    if i[1] != 0:
        afterList.append(i)
return afterList

1
你的第一个例子会导致 IndexError - Blender
这会去除原贴作者想要保留的元素。 - Martijn Pieters
@foriinrangeawesome:运行它。你的循环从列表中删除元素,所以for i in range(len(mylist))会循环太多次。 - Blender
2
不用介意,我意识到示例有问题了。由于删除了数字,列表的长度也发生了变化。对此感到抱歉。 - erdekhayser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接