2011-11-12 43 views
-1

我想遍歷字典,檢查值並刪除匹配某些值的項目。在「for」循環(Python)中從字典中刪除項目的正確方法是什麼?

d = {1, 1, 2, 1, 4, 5} 
for i in d: 
    if i == 1: 
    del i 

但我們知道這樣做是危險的,因爲它是被迭代更新列表。在Python中做這件事的乾淨方式是什麼?

+0

我想你的意思是'd = [1,1,2,1,4,5]'(即括號,而不是花括號)? –

+3

列表或字典? –

+1

爲什麼會得到反對票。我對Python很陌生,想知道如何做到這一點? – Cory

回答

7

如果k是你的字典,你可以做

k = {x:v for x,v in k.iteritems() if x != 1} 

對於2.7+和3.0

對於任何年齡的增長,你可以做

k = dict((x,v) for x,v in k.iteritems() if x!=1) 
+1

注意:只支持Python 3.X和2.7+。 –

+0

謝謝。我將其更新爲包含舊版Python版本的內容。 –

0
for j in range(len(d)-1,-1,-1): 
    if d[j] == 1: 
    del d[j] 
+4

這適用於列表,但難看,不明顯,不推廣到非序列(字典,集合等),而且很少需要。 – delnan

+0

同意。 '因爲我在範圍內(len(something))'幾乎總是一個壞跡象。 –

0

雖然我通常會只需製作一本新字典(參見Noufal Ibrahim的答案),就可以安全地修改現有字典了通過獲取鍵列表,並通過迭代地方:

for k in d.keys(): 
    if d[k] == 1: 
     del d[k] 
+0

注意:在Python 2.X中工作,但在3.X'd.keys()中返回一個字典視圖,並且因爲'RuntimeError:迭代過程中字典大小發生變化'而失敗。在3.X中使用'list(d.keys())'。 –

1

我會建議你使用內置filter功能,因爲它更清楚將用列表來完成。 filter也適用於任何迭代器:序列,容器或迭代器。

下面是一個例子如何使用功能

In [2]: d = [1,1,2,1,4,5] 

In [3]: filter(lambda x: (x!=1), d) 
Out[3]: [2, 4, 5] 

相反拉姆達的,你可以通過將用於從列表過濾數據等功能的名稱的工作。在filter

文檔可以在http://docs.python.org/library/functions.html#filter

還要注意,filter是函數式編程的世界知名,並利用強大的概念,所以你可以甚至是不同的範式發現它在許多其他語言。

+0

'過濾器'不是非常pythonic。相反,使用列表理解會更好。 –

+0

@NoufalIbrahim我可以寫這樣的東西'[el for el in d if el!= 1]',但這隻能用於列表,而不能用於元組等。還要注意,帶有'filter'功能的那段代碼將會理解更多的程序員,例如,將程序移植到另一種語言會更容易。 – Alik

+0

爲什麼它不適用於元組?這也支持迭代器協議。你的第二點並不真正有效。使用lambda進行過濾在Python中速度要慢得多,並且可移植性和可讀性的好處不足以抵消不良風格。 –

相關問題