Python 有效地过滤字典
我们有一个字典Python 有效地过滤字典,python,python-3.x,dictionary,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:字典在迭代期间更改了大小”
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代表k,d1.items()中的v如果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]
为什么你认为第一种方法效率低下<代码>d1.items()在py 3中,它只创建一个视图,不复制dict@Chris_Rands但是,命令“{k:v for k,v in d1.items()if cond(v)}”是否会创建一个新的字典,然后将其放入变量“d1”中?我明白了,所以您希望最大限度地提高内存效率?我将投票重新打开dupe是关于速度的满足
cond(v)
的键集可能很大吗?另外,您希望d1
的大小是多少?@JoelCornett我希望传递的键集包含数万个字符串键。我不确定在Python中这需要多少内存。