是什麼時,該項目的重點是未知從字典中刪除項目的最佳方式?這裏有一個簡單的方法:從Python字典中刪除項目的最佳方法?
for key, item in some_dict.items():
if item is item_to_remove:
del some_dict[key]
有沒有更好的方法?在迭代時從字典中突變(刪除項目)有什麼不妥?
是什麼時,該項目的重點是未知從字典中刪除項目的最佳方式?這裏有一個簡單的方法:從Python字典中刪除項目的最佳方法?
for key, item in some_dict.items():
if item is item_to_remove:
del some_dict[key]
有沒有更好的方法?在迭代時從字典中突變(刪除項目)有什麼不妥?
要知道,你目前正在測試的對象標識(is
只返回True
如果兩個操作數都在內存中的同一對象表示 - 這並不總是有兩個對象,比較平等與==
的情況下)。如果你這樣做是有目的的,那麼你可以重寫你的代碼
some_dict = {key: value for key, value in some_dict.items()
if value is not value_to_remove}
但是你想要的東西,這可能無法做到:
>>> some_dict = {1: "Hello", 2: "Goodbye", 3: "You say yes", 4: "I say no"}
>>> value_to_remove = "You say yes"
>>> some_dict = {key: value for key, value in some_dict.items() if value is not value_to_remove}
>>> some_dict
{1: 'Hello', 2: 'Goodbye', 3: 'You say yes', 4: 'I say no'}
>>> some_dict = {key: value for key, value in some_dict.items() if value != value_to_remove}
>>> some_dict
{1: 'Hello', 2: 'Goodbye', 4: 'I say no'}
所以,你可能想!=
,而不是is not
。
那是字典壓縮?他們什麼時候加入的? – Buttons840 2011-03-27 05:52:41
你可以使用'some_dict。iteritems()'在這裏,並將'for'和'if'語句放在單獨的行上以提高可讀性 – jfs 2011-03-27 05:57:36
我相信字典解析是在Python 2.7中添加的。 – mithrandi 2011-03-27 05:58:46
items()
返回一個列表,它是你迭代該列表,使變異在循環中的字典此處無關緊要。如果您使用iteritems()
代替,變異的字典中環would be problematic,且同樣在Python 2.7 viewitems()
。
我想不出更好的方式通過值刪除從字典項。
沒有什麼錯從字典中刪除項目,而迭代,因爲你提出的。請注意同時使用同一字典的多個線程,這可能會導致KeyError或其他問題。
當然,看文檔在http://docs.python.org/library/stdtypes.html#typesmapping
'for k,v in d.iteritems():del d [k]'會給出'RuntimeError:迭代期間字典改變大小'。請看mithrandi的解釋。 – Buttons840 2011-03-27 05:59:03
當然,d.iteritems()不是原始海報迭代的方式,而不是我在回答中提到的。 – 2011-03-27 06:00:04
>>> dic = {'a':1, 'b':2}
>>> dic
{'a': 1, 'b': 2}
>>> dic.pop('c', 0)
0
>>> dic.pop('a', 0)
1
>>> dic
{'b': 2}
OP詢問有關密鑰未知的情況 – nmz787 2017-05-31 21:51:22
a = {'name': 'your_name','class': 4}
if 'name' in a: del a['name']
我想建立一個需要刪除鍵的列表,然後將其刪除。它簡單,高效,避免了同時迭代和改變字典的任何問題。
keys_to_remove = [key for key, value in some_dict.iteritems()
if value == value_to_remove]
for key in keys_to_remove:
del some_dict[key]
德爾和彈出()之間的簡單比較:
import timeit
code = """
results = {'A': 1, 'B': 2, 'C': 3}
del results['A']
del results['B']
"""
print timeit.timeit(code, number=100000)
code = """
results = {'A': 1, 'B': 2, 'C': 3}
results.pop('A')
results.pop('B')
"""
print timeit.timeit(code, number=100000)
結果:
0.0329667857143
0.0451040902256
所以,德爾快於彈出() 。
但是,性能差異並不大,如果您想避免引發異常,您可以爲''pop()''提供第二個參數(如@ n-1-1如上所述) - 這不是「del」運算符的選項。 – 2014-07-11 07:46:05
輔助問題,但我也一直在努力去理解'timeit'。謝謝你這個明確的例子。 – 2015-05-01 01:02:17
y={'username':'admin','machine':['a','b','c']}
if 'c' in y['machine'] : del y['machine'][y['machine'].index('c')]
下劃線理由禁止變異字典,而迭代這是因爲內部有迭代的訂單,如果發生變異的關鍵,訂單會被破壞,從而導致未知的行爲。 – 8090PZ 2015-07-26 19:21:03
的可能的複製[如何從一個Python字典的關鍵?(http://stackoverflow.com/questions/11277432/how-to-remove-a-key-from-a-python-dictionary) – tripleee 2017-03-24 09:01:34