Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有效地过滤字典_Python_Python 3.x_Dictionary - Fatal编程技术网

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中这需要多少内存。