从Python字典中删除项目的最佳方法?

项目密钥未知时,从字典中删除项目的最佳方法是什么? 这是一个简单的方法:

for key, item in some_dict.items(): if item is item_to_remove: del some_dict[key] 

有更好的方法吗? 在迭代它的时候,从字典中突变(删除项目)有什么问题吗?

请注意,您当前正在testing对象标识(只有在两个操作数都由内存中的同一对象表示的情况下才返回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

 >>> dic = {'a':1, 'b':2} >>> dic {'a': 1, 'b': 2} >>> dic.pop('c', 0) 0 >>> dic.pop('a', 0) 1 >>> dic {'b': 2} 
 a = {'name': 'your_name','class': 4} if 'name' in a: del a['name'] 

delpop()之间的简单比较:

 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 

所以delpop()更快。

items()返回一个列表,它是你正在迭代的列表,所以在循环中改变字典在这里并不重要。 如果使用iteritems() ,则在循环中改变字典会有问题 ,对于Python 2.7中的viewitems()也是如此。

我想不出一个更好的方法来从字典中删除项目的价值。

我会build立一个需要删除的密钥清单,然后删除它们。 它简单,高效,避免了同时迭代和改变字典的任何问题。

 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] 
 y={'username':'admin','machine':['a','b','c']} if 'c' in y['machine'] : del y['machine'][y['machine'].index('c')] 

正如你所build议的,迭代时从字典中删除项目没有任何问题。 请注意多个线程同时使用相同的字典,这可能会导致KeyError或其他问题。

当然,请参阅http://docs.python.org/library/stdtypes.html#typesmapping上的文档;