Naivelly我会用:
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如何在没有实际使用显式迭代器的情况下进行编辑。
答案 0 :(得分:3)
找到要删除的所有键,然后删除:
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
答案 1 :(得分:1)
以上是Stack Overflow问题的回答:Modifying a Python dict while iterating over it
dictionary.items()
返回无法修改的视图
但是如果你迭代list(dictionary.items())
,你可以修改字典而不会有迭代器异常的风险。
答案 2 :(得分:0)
for k, v in dictionary.viewkeys():
if f(dictionary[k]):
del dictionary[k]