Ere*_*evi 5 python dictionary python-3.x
我们有一本字典d1
和一个条件cond
.我们希望d1只包含满足条件的值cond
.一种方法是:
d1 = {k:v for k,v in d1.items() if cond(v)}
Run Code Online (Sandbox Code Playgroud)
但是,这会创建一个新的字典,如果d1
很大,可能会非常低效.
另一种选择是:
for k,v in d1.items():
if not cond(v):
d1.pop(k)
Run Code Online (Sandbox Code Playgroud)
但是,这会在迭代时修改字典,并生成错误:"RuntimeError:字典在迭代期间改变了大小".
Python 3中就地过滤字典的正确方法是什么?
如果满足条件的键对应的值不多,那么可以先聚合键,然后剪枝字典:
for k in [k for k,v in d1.items() if cond(v)]:
del d1[k]
Run Code Online (Sandbox Code Playgroud)
万一列表[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]
Run Code Online (Sandbox Code Playgroud)