[英]sum list of dictionary values
我有一个这种形式的字典列表:
[
{'signal_8': 1, 'signal_1': 7, 'signal_10': 5, 'signal_5': 2, 'signal_2': 5, 'signal_6': 3, 'signal_4': 9, 'signal_3': 6, 'signal_9': 4, 'signal_7': 8},
{'signal_8': 1, 'signal_1': 7, 'signal_10': 5, 'signal_5': 2, 'signal_2': 5, 'signal_6': 3, 'signal_4': 9, 'signal_3': 6, 'signal_9': 4, 'signal_7': 8},
{'signal_8': 1, 'signal_1': 7, 'signal_10': 5, 'signal_5': 2, 'signal_2': 5, 'signal_6': 3, 'signal_4': 9, 'signal_3': 6, 'signal_9': 4, 'signal_7': 8},
]
并且我希望将列表中每个元素的键值相加:
{
'signal_8': 3,
'signal_1': 21,
'signal_10': 15,
'signal_5': 6,
'signal_2': 15,
'signal_6': 9,
'signal_4': 27,
'signal_3': 18,
'signal_9': 12,
'signal_7': 24
}
我试过的是以下内容:
result = {}
sm = 0
for elm in original_list:
for k,v in elm.items():
sm += v
result[k] = sm
print(result)
但它仍然无效。
与daveruinseverything的答案类似,我用Counter
解决了这个问题,但是使用了它的update
方法。
让signals
成为您的词典列表。
>>> from collections import Counter
>>> c = Counter()
>>> for d in signals:
... c.update(d)
...
>>> c
Counter({'signal_4': 27, 'signal_7': 24, 'signal_1': 21, 'signal_3': 18, 'signal_10': 15, 'signal_2': 15, 'signal_9': 12, 'signal_6': 9, 'signal_5': 6, 'signal_8': 3})
为了Op,你能简单描述一下这里发生了什么吗?
Counter
工作方式与dict
类似,但其update
方法会将值添加到预先存在的键的值中,而不是覆盖它们。
你想要的是Counter
集合类型。 集合上的Python文档最好地描述它,但本质上Counter
是一种特殊的字典,其中所有值都是整数。 您可以传递任何密钥,包括不存在的密钥,并添加到它们。 例如:
from collections import Counter
original_list = [
{'signal_8': 1, 'signal_1': 7, 'signal_10': 5, 'signal_5': 2, 'signal_2': 5, 'signal_6': 3, 'signal_4': 9, 'signal_3': 6, 'signal_9': 4, 'signal_7': 8},
{'signal_8': 1, 'signal_1': 7, 'signal_10': 5, 'signal_5': 2, 'signal_2': 5, 'signal_6': 3, 'signal_4': 9, 'signal_3': 6, 'signal_9': 4, 'signal_7': 8},
{'signal_8': 1, 'signal_1': 7, 'signal_10': 5, 'signal_5': 2, 'signal_2': 5, 'signal_6': 3, 'signal_4': 9, 'signal_3': 6, 'signal_9': 4, 'signal_7': 8},
]
result = Counter()
for elem in original_list:
for key, value in elem.items():
result[key] += value
print(result)
编辑:@timgeb提供了这个答案的变体,它使Counter
对象的本地使用update()
方法。 我建议这里作为最好的答案
您的代码的问题在于,无论密钥是什么,您都要汇总sm
和v
。 您可以在下面找到适用于您的代码的重新格式化版本。 它只是将列表中每个元素的值添加到结果对象:
from collections import defaultdict
result = defaultdict(int)
for elm in original_list:
for k, v in elm.items():
result[k] += v
print(result)
或者,只需一个衬垫,您就可以:
result = {key: sum(e[key] for e in original_list) for key in original_list[0].keys()}
使用itertools.groupby
,你可以做类似的事情
merged_list = sorted(p for l in original_list for p in l.items())
groups = groupby(merged_list, key=lambda p: p[0])
result = {signal: sum(pair[1] for pair in pairs) for signal, pairs in groups}
如果您可以假设每个字典包含完全相同的键,则上面的内容可以简化为
{k: sum(d[k] for d in original_list) for k in original_list[0]}
另请注意,数据分析库pandas使这些操作变得微不足道:
In [70]: import pandas as pd
In [72]: pd.DataFrame(original_list).sum()
Out[72]:
signal_1 21
signal_10 15
signal_2 15
signal_3 18
signal_4 27
signal_5 6
signal_6 9
signal_7 24
signal_8 3
signal_9 12
dtype: int64
您当前的代码对所有信号使用一个累加和,而您需要为每个信号分别求和。
如果你希望你的原始代码工作,你需要首先检查钥匙存在的result
,并初始化它事先0,如果事实并非如此。 然后累积相应密钥的总和。
码:
result = {}
for elm in original_list:
for k, v in elm.items():
# Initialise it if it doesn't exist
if k not in result:
result[k] = 0
# accumulate sum seperately
result[k] += v
print(result)
输出:
{'signal_9': 12, 'signal_8': 3, 'signal_1': 21, 'signal_3': 18, 'signal_2': 15, 'signal_5': 6, 'signal_4': 27, 'signal_7': 24, 'signal_6': 9, 'signal_10': 15}
注意:正如其他人所示,为避免自己初始化,您可以使用collections.defaultdict()
或collections.Counter()
代替。
尝试这个:
original_list = [
{'signal_8': 1, 'signal_1': 7, 'signal_10': 5, 'signal_5': 2, 'signal_2': 5, 'signal_6': 3, 'signal_4': 9, 'signal_3': 6, 'signal_9': 4, 'signal_7': 8},
{'signal_8': 1, 'signal_1': 7, 'signal_10': 5, 'signal_5': 2, 'signal_2': 5, 'signal_6': 3, 'signal_4': 9, 'signal_3': 6, 'signal_9': 4, 'signal_7': 8},
{'signal_8': 1, 'signal_1': 7, 'signal_10': 5, 'signal_5': 2, 'signal_2': 5, 'signal_6': 3, 'signal_4': 9, 'signal_3': 6, 'signal_9': 4, 'signal_7': 8},
]
print({k:sum([x[k] for x in original_list if k in x]) for i in original_list for k,v in i.items()})
输出:
{'signal_8': 3, 'signal_1': 21, 'signal_10': 15, 'signal_5': 6, 'signal_2': 15, 'signal_6': 9, 'signal_4': 27, 'signal_3': 18, 'signal_9': 12, 'signal_7': 24}
请注意,如果信号丢失,它只会将其视为零
你能试试下面的代码吗?
basedict=siglist[0]
for k in basedict.keys():
result=[currdict[k] for currdict in siglist]
endval=sum(result)
print("Key %s and sum of values %d"%(k,endval))
产量
Key signal_9 and sum of values 12
Key signal_2 and sum of values 15
Key signal_8 and sum of values 3
Key signal_5 and sum of values 6
Key signal_7 and sum of values 24
Key signal_10 and sum of values 15
Key signal_1 and sum of values 21
Key signal_6 and sum of values 9
Key signal_4 and sum of values 27
Key signal_3 and sum of values 18
注意: - 由于我们确信所有词典中的所有键都相同,因此该解决方案运行良好。 如果你有一个非匹配元素的字典,那么它将导致KeyError
。 所以要注意这个限制
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.