Python 如何删除DICT列表中特定键的所有项?
我正试图根据dict的某些项的密钥删除它们,下面是我的代码:Python 如何删除DICT列表中特定键的所有项?,python,Python,我正试图根据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}] 有更
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}]
有更好的方法吗?稍微简化一下:
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
for d in l:
if d.has_key('b'):
del d['b']
有些人可能也会这样做
for d in l:
try:
del d['b']
except KeyError:
pass
在Python中捕获这样的异常并不像在其他语言中那样昂贵。我喜欢您这样做的方式(除了您使用循环变量,但其他人已经指出了这一点),它是可扩展的,易于理解。如果您想要尽量减少键入的内容,则此操作有效: [x.pop('b',无)表示l中的x] 但是请注意,只有一个“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键。d1={'a':1,'b':2}
d2={'a':1}
l=[d1,d2,d1,d2,d1,d2]
对于范围内的i(len(l)):
如果l[i]具有_键('b'):
del l[i][b']
打印l
下面是对您的代码的一点回顾:
for item in l:
if 'b' in item:
del item['b']
您还需要注意的一点是,在调用del的第一次迭代中,实际上您将删除所有需要的内容,因为d1是可变的。您需要认为d1是一个引用,而不是值(有点像C中的指针)
正如Lennart Regebro在优化代码时提到的那样,您也可以使用列表理解。您确实意识到[d1、d2、d1、d2、d1、d2]包含对两个dict的引用,而不是副本,对吗?i、 e.在这个例子中,你可以用del d1['b']替换for循环,它会产生同样的效果。+1,到目前为止,最好的方法是使用正确的循环,避免其他答案中的双重索引(首先检查成员资格,然后删除),这是原始问题。我担心使用“pop”,但它是有意义的,因为双重索引,谢谢-1用于使用列表理解其副作用+1有关dicts副本的警告。总分:0哦,我说过我不喜欢,但你可以。:)谢谢你的反馈,直到现在我才明白(或记得)