【发布时间】:2018-02-16 09:51:48
【问题描述】:
我们有一个字典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: dictionary changed size during iteration”。
在 Python 3 中就地过滤字典的正确方法是什么?
【问题讨论】:
-
为什么你认为第一种方式效率低?
d1.items()在 py 3 中只创建一个视图,它不会复制字典 -
@Chris_Rands 但是,命令“{k:v for k,v in d1.items() if cond(v)}”不会创建一个新字典,然后将其放入变量“d1”?
-
我明白了,所以你想最大化内存效率?我会投票重新打开欺骗是关于速度
-
满足
cond(v)的键集可能很大吗?另外,您希望d1变得多大? -
@JoelCornett 我希望传递键的集合有数万个字符串键。我不确定这在 Python 中需要多少内存。
标签: python python-3.x dictionary