Python从字典中删除了哪些值适合函数?

时间:2014-10-24 23:58:24

标签: python python-3.x dictionary

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如何在没有实际使用显式迭代器的情况下进行编辑。

3 个答案:

答案 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]