我想遍歷字典,檢查值並刪除匹配某些值的項目。在「for」循環(Python)中從字典中刪除項目的正確方法是什麼?
例
d = {1, 1, 2, 1, 4, 5}
for i in d:
if i == 1:
del i
但我們知道這樣做是危險的,因爲它是被迭代更新列表。在Python中做這件事的乾淨方式是什麼?
我想遍歷字典,檢查值並刪除匹配某些值的項目。在「for」循環(Python)中從字典中刪除項目的正確方法是什麼?
例
d = {1, 1, 2, 1, 4, 5}
for i in d:
if i == 1:
del i
但我們知道這樣做是危險的,因爲它是被迭代更新列表。在Python中做這件事的乾淨方式是什麼?
如果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)
注意:只支持Python 3.X和2.7+。 –
謝謝。我將其更新爲包含舊版Python版本的內容。 –
for j in range(len(d)-1,-1,-1):
if d[j] == 1:
del d[j]
這適用於列表,但難看,不明顯,不推廣到非序列(字典,集合等),而且很少需要。 – delnan
同意。 '因爲我在範圍內(len(something))'幾乎總是一個壞跡象。 –
雖然我通常會只需製作一本新字典(參見Noufal Ibrahim的答案),就可以安全地修改現有字典了通過獲取鍵列表,並通過迭代地方:
for k in d.keys():
if d[k] == 1:
del d[k]
注意:在Python 2.X中工作,但在3.X'd.keys()中返回一個字典視圖,並且因爲'RuntimeError:迭代過程中字典大小發生變化'而失敗。在3.X中使用'list(d.keys())'。 –
我會建議你使用內置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
是函數式編程的世界知名,並利用強大的概念,所以你可以甚至是不同的範式發現它在許多其他語言。
'過濾器'不是非常pythonic。相反,使用列表理解會更好。 –
@NoufalIbrahim我可以寫這樣的東西'[el for el in d if el!= 1]',但這隻能用於列表,而不能用於元組等。還要注意,帶有'filter'功能的那段代碼將會理解更多的程序員,例如,將程序移植到另一種語言會更容易。 – Alik
爲什麼它不適用於元組?這也支持迭代器協議。你的第二點並不真正有效。使用lambda進行過濾在Python中速度要慢得多,並且可移植性和可讀性的好處不足以抵消不良風格。 –
我想你的意思是'd = [1,1,2,1,4,5]'(即括號,而不是花括號)? –
列表或字典? –
爲什麼會得到反對票。我對Python很陌生,想知道如何做到這一點? – Cory