Python从字典中删除项谁的值适合一个函数?

2024-04-20 11:21:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我天真地用:

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如何在不使用显式迭代器的情况下进行这种就地编辑。你知道吗


Tags: 方法in编辑fordictionaryif字典foo
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

下面是上一个堆栈溢出问题的答案:Modifying a Python dict while iterating over it

dictionary.items()返回一个不能修改的视图 但是,如果您在list(dictionary.items())上进行迭代,您可以修改字典,而不会出现迭代器异常的风险。你知道吗

for k, v in dictionary.viewkeys():
     if f(dictionary[k]):
         del dictionary[k]

相关问题 更多 >