Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.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_Dictionary_Optimization - Fatal编程技术网

在Python中合并(同时保留值)多个字典的最快方法?

在Python中合并(同时保留值)多个字典的最快方法?,python,dictionary,optimization,Python,Dictionary,Optimization,我在谷歌上搜索合并词典,但我看到的结果都是假设替换值。也就是说,如果您使用一个类似于{'config_prop':2}的dict和另一个类似于{'config_prop':7}的dict,合并的最终结果是{'config_prop':7}。我想要的是{'config_prop':9} 我的天真方法如下,虽然有效,但相当缓慢 split_output = [{'some_prop': 1}, {'some_prop': 2, 'other_prop': 19}] combined_output =

我在谷歌上搜索合并词典,但我看到的结果都是假设替换值。也就是说,如果您使用一个类似于
{'config_prop':2}
的dict和另一个类似于
{'config_prop':7}
的dict,合并的最终结果是
{'config_prop':7}
。我想要的是
{'config_prop':9}

我的天真方法如下,虽然有效,但相当缓慢

split_output = [{'some_prop': 1}, {'some_prop': 2, 'other_prop': 19}]
combined_output = {}
    for d in split_output:
        if combined_output == {}:
            combined_output = d.copy()
        else:
            for key, value in d.items():
                if key in combined_output:
                    combined_output[key] = combined_output[key] + value  # add to existing val
                else:
                    combined_output[key] = value
我很想听听关于更好的方法的建议。谢谢

更新:我尝试过这个,但它比我的原始代码慢得多:

final_count = Counter() 
for d in split_output:
    final_count += Counter(d)   
final_output = dict(final_count)

您可以使用以下选项:

from collections import Counter

A = Counter({'config_prop': 2})
B = Counter({'config_prop': 7})
A + B

您可以使用以下选项:

from collections import Counter

A = Counter({'config_prop': 2})
B = Counter({'config_prop': 7})
A + B
能用字典理解

能用字典理解


我很快介绍了几种不同的方法来回答您的问题:

combined_output = [{'some_prop': 1}, {'some_prop': 2, 'other_prop': 19}]

# set key or append value to new dictionary object:

def dict_sum(dicts):
    output = {}
    for d in dicts:
        for key, value in d.iteritems():
            if key in output:
                output[key] += value
            else:
                output[key] = value
        return output

# Implement a reducer function using functools:

from functools import reduce

def reducer(accumulator, element):
    for key, value in element.items():
        accumulator[key] = accumulator.get(key, 0) + value
    return accumulator

# Use a Counter:

from collections import Counter

def sum_dicts_values_by_key(dicts):
    return dict(sum([Counter(x) for x in combined_output], Counter()))

# Using dictionary comprehension:

def sum_dict_comprehension(dicts):
    return {k: sum([i[k] for i in dicts]) 
    if k in dicts[0] else i[k] for i in dicts for k in i}
使用
timeit
运行快速基准测试进行比较:

res_1 = dict_sum(combined_output)
1000000 loops, best of 3: 457 ns per loop

res_2 = reduce(reducer, combined_output, {})
1000000 loops, best of 3: 1.35 µs per loop

res_3 = sum_dicts_values_by_key(combined_output)
100000 loops, best of 3: 12.8 µs per loop

res_4 = sum_dict_comprehension(combined_output)
1000000 loops, best of 3: 1.53 µs per loop

我很快介绍了几种不同的方法来回答您的问题:

combined_output = [{'some_prop': 1}, {'some_prop': 2, 'other_prop': 19}]

# set key or append value to new dictionary object:

def dict_sum(dicts):
    output = {}
    for d in dicts:
        for key, value in d.iteritems():
            if key in output:
                output[key] += value
            else:
                output[key] = value
        return output

# Implement a reducer function using functools:

from functools import reduce

def reducer(accumulator, element):
    for key, value in element.items():
        accumulator[key] = accumulator.get(key, 0) + value
    return accumulator

# Use a Counter:

from collections import Counter

def sum_dicts_values_by_key(dicts):
    return dict(sum([Counter(x) for x in combined_output], Counter()))

# Using dictionary comprehension:

def sum_dict_comprehension(dicts):
    return {k: sum([i[k] for i in dicts]) 
    if k in dicts[0] else i[k] for i in dicts for k in i}
使用
timeit
运行快速基准测试进行比较:

res_1 = dict_sum(combined_output)
1000000 loops, best of 3: 457 ns per loop

res_2 = reduce(reducer, combined_output, {})
1000000 loops, best of 3: 1.35 µs per loop

res_3 = sum_dicts_values_by_key(combined_output)
100000 loops, best of 3: 12.8 µs per loop

res_4 = sum_dict_comprehension(combined_output)
1000000 loops, best of 3: 1.53 µs per loop

六羟甲基三聚氰胺六甲醚。。。这个想法很有趣,但比以前慢了很多。我用我尝试过的新代码更新了这个问题。我不确定为什么。但声称计数器是最快的,并解释了什么可能会减慢速度。想想看吧,Hmmm.。这个想法很有趣,但比以前慢了很多。我用我尝试过的新代码更新了这个问题。我不确定为什么。但声称计数器是最快的,并解释了什么可能会减慢速度。考虑阅读它。添加第四种方法来剖析字典理解谢谢,韦斯!回答得很好。我想知道dict大小是否会影响这一点。在我的例子中,我有两个dict,每个dict的键值对略多于400000。添加了第四个方法来分析字典的理解谢谢,Wes!回答得很好。我想知道dict大小是否会影响这一点。在我的例子中,我有两个dict,每个dict有400000多个键值对。