假设我们在python3中有一个dict d={"key1":-1,"key2":-2,"key3":3,"key4":0,"key5":-7,"key6":1,...}
。现在我想删除值为负的键,例如,"key1":-1
,"key2":-2
等。我试着编写这样的代码:
for k in d:
if d[k]<0:
del d[k]
但我收到错误说“RuntimeError:字典在迭代期间改变了大小”。从这条消息来看,似乎不可能使用简单的迭代删除满足某些标准的字典的键,所以此刻,我必须将要删除的键保存在列表中,然后编写另一个迭代来删除它们来自d
。我的问题是:是否真的不可能使用单次迭代删除一些键?如果可能的话,你能否给出Python3的示例代码,它可以使用Python3中的简单迭代删除符合某些标准的密钥?谢谢。
答案 0 :(得分:3)
方法#1:使用字典理解。这不会像删除那么多删除,而是让你进入相同的d
。
>>> d = {"key1":-1,"key2":-2,"key3":3,"key4":0,"key5":-7}
>>> d = {k: v for k,v in d.items() if v >= 0}
>>> d
{'key3': 3, 'key4': 0}
方法#2:迭代密钥的独立副本:
>>> d = {"key1":-1,"key2":-2,"key3":3,"key4":0,"key5":-7}
>>> for k in set(d):
... if d[k] < 0:
... del d[k]
...
>>> d
{'key3': 3, 'key4': 0}
答案 1 :(得分:1)
迭代键而不是dict:
for k in d.keys():
if d[k]<0:
del d[k]
为了在Python 3.X中工作,keys()
返回一个迭代器,所以你需要使用以下第一行:
for k in list(d.keys()):