迭代列表时获取索引

时间:2012-02-06 00:49:16

标签: python list loops

当我正在处理列表时,如何获取当前项的id以引用它以列出方法?

xl = [1,2,3] # initial list
yl = [3,2]   # list used to remove items from initial list

for x in xl[:]:
    for y in yl:
        if x == y:
            xl.pop(x) # problem
            break
        print x, y
print xl

在简单示例中,我想遍历2个列表,当我找到类似的项目时,将其从列表1中删除。

在“#problem”评论的行中我应该使用什么而不是X?

PS:请注意,这是我正在迭代的副本。

3 个答案:

答案 0 :(得分:8)

执行此操作的一般方法是使用enumerate

for idx, item in enumerate(iterable):
  pass

但是对于你的用例,这不是一种非常pythonic的方式来做你似乎正在尝试的东西。应避免迭代列表并同时修改它。只需使用列表理解:

xl = [item for item in xl if item not in yl]

答案 1 :(得分:4)

xl = [x for x in xl if x not in y]

怎么样?

这称为list comprehension

答案 2 :(得分:2)

您应该只使用filter

,而不是删除您不喜欢的元素
x1 = filter(x1, lambda x: x not in y1)

或者,list comprehension也适用:

x1 = [x for x in x1 if x not in y1]

如果y1非常大,你应该在一个集合中查找,如下所示:

y1set = set(y1)
x1 = filter(x1, lambda x: x not in y1set)

作为参考,pop采用索引,获取索引的通用方法是enumerate。但是,几乎在所有情况下,编写代码的方式都比使用索引更简洁。