我有一个相同类型对象的列表。我想迭代该列表并删除其中达到特殊条件的对象。如下:
links = [{"source":0, "target":1}, ....]
for link in links:
if {"source":link["target"], "target":link["sourcec"]} not in links:
links.remove(link)
但是我发现for循环没有访问列表中的每个元素。所以我猜想基于列表索引的for循环。是否有一个很好的方法来删除操作?
答案 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行是“......不在链接中”,而不是“链接”吗?