python - 有效地就地过滤字典

标签 python python-3.x dictionary

我们有一个字典 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)] 太大,可以“轮流”处理字典,即组装键直到它们的数量不超过阈值,修剪字典,并重复直到没有更多的键满足条件:

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]

关于python - 有效地就地过滤字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48824056/

相关文章:

python - python中的唯一排序

python - 如何创建多个数据帧而不从一个数据帧重复?

python - Pytorch ValueError : Expected target size (2, 13),调用 CrossEntropyLoss 时得到 torch.Size([2])

python - 使用 Python 将字典键分配给给定列表

ios - 在 MKMapView 上更新和组织覆盖

python - 从 {index : list of row values} 形式的字典构造 Pandas DataFrame

python - 如何在 SQLAlchemy 关系中从父级中删除子级

Python 在运行时更改日志文件位置

python - Pandas 将列转换为时间

Python 3 urllib 产生 TypeError : POST data should be bytes or an iterable of bytes. 它不能是 str 类型