2015-03-31 60 views
0

我有一個相同類型的對象的列表。我想迭代該列表並刪除其中達到特殊條件的對象。如下:爲基於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循環。有沒有一種很好的方法去除操作?

+0

一個例子會更好。 – 2015-03-31 02:30:25

+0

如果你正在尋找刪除任何沒有返回鏈接的鏈接,那麼雖然不建議更新列表,但你應該重複這個工作......你能分享預期的輸出和任何錯誤。 – AChampion 2015-03-31 02:35:08

+0

請提供一個簡短,完整的程序,演示您遇到的問題。 – 2015-03-31 02:44:03

回答

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) 
0

您可以創建一個新列表,它是原始列表的子集,然後丟棄原始列表。

+0

這是首選的Python方法 - 不是刪除不需要的列表項,而是創建一個新的只是你想要的項的列表,然後將它重新分配給原始列表的變量名。 – PaulMcG 2015-03-31 02:47:10

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

>>> [] 

工作正常。你一定在做一些你沒有想到的事情。 在大多數情況下,您的邏輯似乎很可能會清空您的列表。你是否希望第三行是「...不在鏈接中」,而不是「鏈接」?

+0

僅當列表中只有1個元素時纔有效。 – PaulMcG 2015-03-31 02:46:11

+0

如果if語句爲true,則列表根本不會改變。 – Zizouz212 2015-03-31 02:49:06

+0

if語句是真實的,所以在這種情況下,第一個鏈接(僅鏈接)被刪除。沒有其他的比較鏈接,但每個不匹配的鏈接都會被刪除,從而導致鏈接比原本更短,除非列表中的每個鏈接都是{1:3,5:6}。 – 2015-03-31 02:54:35

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 
+0

如果列表大?我認爲,無論我如何修改原始列表,它仍然可以訪問列表中剩餘的每個列表。 – stamaimer 2015-03-31 02:51:54

0

看起來您正在修改正在迭代的列表。這可能會導致某些索引被跳過,因爲刪除元素時索引會發生變化。我認爲,這可以通過使用列表解析來解決了這個樣子:

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

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

編輯:羅布似乎也張貼着列表理解的答案,而我是寫我的。請參考他所提供的其他方法