繁体   English   中英

有效地过滤字典

[英]Efficiently filtering a dictionary in-place

我们有一个字典d1和条件cond 我们希望d1只包含满足条件cond的值。 一种方法是:

d1 = {k:v for k,v in d1.items() if cond(v)}

但是,这会创建一个新的字典,如果d1很大,它可能是非常低效的内存。

另一种选择是:

for k,v in d1.items():
    if not cond(v):
       d1.pop(k)

但是,这会在迭代时修改字典,并生成错误:“RuntimeError:字典在迭代期间改变了大小”。

Python 3中就地过滤字典的正确方法是什么?

如果没有多个密钥的相应值满足条件,那么您可能首先聚合密钥然后修剪字典:

for k in [k for k,v in d1.items() if cond(v)]:
    del d1[k]

如果列表[k for k,v in d1.items() if cond(v)]太大,则可以“轮流”处理字典,即组装密钥直到它们的计数不超过a阈值,修剪字典,并重复,直到没有更多的键满足条件:

from itertools import islice

def prune(d, cond, chunk_size = 1000):
    change = True
    while change:
        change = False

        keys = list(islice((k for k,v in d.items() if cond(v)), chunk_size))
        for k in keys:
            change = True
            del d[k]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM