我会天真地使用:

for k, v in dictionary.items():
    if foo(v):
        del dictionary[k]


但是,这将导致迭代器异常,因为我在对其进行迭代时编辑字典大小。那我该怎么办呢? -特别是在不复制字典的情况下,使用复制方法:

copydict = dict(dictionary)
for k, v in copydict.items():
    if foo(v):
        del dictionary[k]


我希望看到python如何在不实际使用显式迭代器的情况下进行此类编辑。

最佳答案

找到所有要删除的密钥,然后在之后删除:

d = {1: 2, 3: 4, 5: 6}
remove = [k for k  in d if foo(d[k])]
for k in remove:
    del d[k]


In [38]: %%timeit
   ....: d = {1: 2, 3: 4, 5: 6}
   ....: matching_items = ((k, v) for k, v in list(d.items()) if v > 2)
   ....: d.clear()
   ....: d.update(matching_items)
   ....:
100000 loops, best of 3: 2.85 µs per loop

In [40]: %%timeit
        d = {1: 2, 3: 4, 5: 6}
        remove =[k for k  in d if d[k]> 2]
        for k in remove:
           del d[k]
   ....:
1000000 loops, best of 3: 873 ns per loop

关于python - Python从字典中删除项目谁的值适合函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26557914/

10-16 22:45