我正在尝试根据密钥删除某些dict项,这是我的代码:
d1 = {'a': 1, 'b': 2}
d2 = {'a': 1}
l = [d1, d2, d1, d2, d1, d2]
for i in range(len(l)):
if l[i].has_key('b'):
del l[i]['b']
print l
输出将是:
[{'a': 1}, {'a': 1}, {'a': 1}, {'a': 1}, {'a': 1}, {'a': 1}]
有更好的方法吗?
答案 0 :(得分:16)
d1 = {'a': 1, 'b': 2}
d2 = {'a': 1}
l = [d1, d2, d1, d2, d1, d2]
for d in l:
d.pop('b',None)
print l
答案 1 :(得分:3)
略有简化:
for d in l:
if d.has_key('b'):
del d['b']
有些人也可能会这样做
for d in l:
try:
del d['b']
except KeyError:
pass
在Python中捕获这样的异常并不像其他语言那样昂贵。
答案 2 :(得分:2)
我喜欢你这样做的方式(除了你使用循环变量,但其他人已经指出了),它是明确的,易于理解。如果你想要一些可以减少输入的东西,那么这就可以了:
[x.pop('b',None)for x in l]
请注意,只有一个'b'会被删除,因为你的列表l引用了词典。所以在上面运行你的代码,然后打印出d1,你会注意到你实际上也从d1中删除了b键。
为避免这种情况,您需要复制词典:
d1 = {'a': 1, 'b': 2}
d2 = {'a': 1}
l = [d1.copy(), d2.copy(), d1.copy(), d2.copy(), d1.copy(), d2.copy()]
[b.pop('b', None) for b in l]
d1现在将保留b键。
答案 3 :(得分:0)
d1 = {'a':1,'b':2} d2 = {'a':1}
l = [d1,d2,d1,d2,d1,d2]
表示范围内的i(len(l)): 如果l [i] .has_key('b'): del l [i] ['b']
print l
以下是对您的代码的一些评论:
所以你的代码变成了:
for item in l:
if 'b' in item:
del item['b']
还需要注意的另一件事是,在第一次调用del的迭代中,实际上你将删除所有你需要的东西,因为d1是可变的。你需要认为d1是一个引用,而不是值(有点像C中的指针)。
正如Lennart Regebro提到的那样,为了优化你的代码,你也可以使用列表理解。