2008-10-03 20 views
6

这确实是只有简单的用一个例子来解释中删除字典的一个子集,所以从字典中删除列表的十字路口,我平时做这样的事情:从列表

a = {1:'', 2:'', 3:'', 4:''} 
exclusion = [3, 4, 5] 

# have to build up a new list or the iteration breaks 
toRemove = [] 
for var in a.iterkeys(): 
    if var in exclusion: 
     toRemove.append(var) 

for var in toRemove: 
    del a[var] 

这看起来可能是一个不寻常的例子,但是我不得不这样做的次数令人惊讶。用set来做这件事会更好,但我显然想保留这个字典的'价值'。

这种方法很烦人,因为它需要两个循环和一个额外的数组。有没有更干净和更有效的方式来做到这一点。

回答

12

考虑dict.pop

for key in exclusion: 
    a.pop(key, None) 

None不断弹出引发异常时key并非关键。

+0

哦,这比我的回答好得多。 – SpoonMeiser 2008-10-03 14:32:42

+0

不错的提示,dict.pop是经常遗忘的。 – camflan 2008-10-03 15:34:25

2

为什么不使用keys方法而不是iterkeys?这样你可以在一个循环中完成它,因为它返回一个列表,而不是迭代器。

3
a = dict((key,value) for (key,value) in a.iteritems() if key not in exclusion) 
1

您可以将您的排除列表更改为一个集合,然后使用交集来获得重叠。

exclusion = set([3, 4, 5]) 

for key in exclusion.intersection(a): 
    del a[key]