为基于python的索引中的每个循环做什么?

时间:2015-03-31 02:27:36

标签: python

我有一个相同类型对象的列表。我想迭代该列表并删除其中达到特殊条件的对象。如下:

    links = [{"source":0, "target":1}, ....]
    for link in links:
        if {"source":link["target"], "target":link["sourcec"]} not in links:
            links.remove(link)

但是我发现for循环没有访问列表中的每个元素。所以我猜想基于列表索引的for循环。是否有一个很好的方法来删除操作?

5 个答案:

答案 0 :(得分:5)

内置函数filter可以满足您的需求。这是使用它的一种方法:

links = [{"source":0, "target":1},
         {"source":0, "target":2},
         {"source":0, "target":3},
         {"source":1, "target":0}]

links = filter(
    lambda link: {"source":link["target"], "target":link["source"]} in links,
    links)

print links

作为替代方案,您可以使用列表理解:

links = [link
         for link in links
         if {"source":link["target"], "target":link["source"]} in links
        ]

或者,正如其他人所指出的那样,您可以制作原始列表的副本,然后重复该副本:

for link in links[:]:
    if {"source":link["target"], "target":link["source"]} not in links:
        links.remove(link)

答案 1 :(得分:0)

您可以创建一个新列表,该列表是原始列表的子集,然后丢弃原始列表。

答案 2 :(得分:0)

原因是您在迭代期间修改了列表。

如果您的列表不是那么大,可以复制它:

import copy

links = [{"source":0, "target":1}, ]
links_copy = copy.copy(links)
for link in links:
    if {"source":link["target"], "target":link["source"]} not in links:
        links_copy.remove(link)

links = links_copy

答案 3 :(得分:0)

看起来您正在修改正在迭代的列表。这可能会导致某些索引被跳过,因为删除元素时索引会如何移动。我认为这可以通过使用如下所示的列表推导来解决:

list = [x for x in list if <condition>]

了解更多信息: http://www.secnetix.de/olli/Python/list_comprehensions.hawk

编辑:在我写作时,Rob似乎已经用列表推导发布了答案。请参考他提出的其他方法

答案 4 :(得分:-2)

links = [{1:2, 2:4}]
for link in links:
    if {1:3, 5:6} not in links:
        links.remove(link)
links

>>> []

工作正常。你必须做一些你没想到的事情。 在大多数情况下,您的逻辑很可能会清空您的列表。你想要第3行是“......不在链接中”,而不是“链接”吗?