是否可以使用Python 3中的简单迭代删除符合某些条件的键?

时间:2013-12-12 02:44:16

标签: python-3.x

假设我们在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中的简单迭代删除符合某些标准的密钥?谢谢。

2 个答案:

答案 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()):