繁体   English   中英

如果有一个类似的键(元组),Python汇总一个字典的元素

[英]Python summing elements of one dict if the have a similar key(tuple)

我有一个单一的字典看起来像这样:

{('20144', 'Wirtschaftskammer Österreich Fachverband der Telekommunikations- und Rundfunkunternehmungen', 'Bezirksrundschau Oberösterreich', '4'): 12321.88, ('20143', 'Wirtschaftskammer Niederösterreich Fachgruppe Unternehmensberatung und Informationstechnologie NÖ', 'trend', '31'): 5700.53, ('20144', 'Wirtschaftskammer Tirol - Sparte Gewerbe und Handwerk Innung der Lebensmittelgewerbe', 'ORF Radio Tirol', '4'): 5861.56, ('20144', 'Bundesministerium für Land- und Forstwirtschaft Umwelt und Wasserwirtschaft', 'Weekend Magazin', '2'): 17355.1, ('20144', 'Bundesministerium für Land- und Forstwirtschaft Umwelt und Wasserwirtschaft', 'Woman', '2'): 12911.5, ('20144', 'Bundesministerium für Wissenschaft Forschung und Wirtschaft', 'Die Presse', '31'): 30965.4, ('20143', 'Bundesministerium für Europa Integration und Äußeres', 'Kronen Zeitung', '4'): 52490.46,.......)}

我想要将密钥具有相同数字的所有值(例如20144 )和结尾处的相同数字(例如23120144

我想到了一个字典理解,但我正在努力比较我需要的键。 我怎样才能轻松比较它们?

解:

trimmed={}
for k,v in data.items(): 
    trimmed.setdefault((k[0],k[-1]),[]).append(v)

{k:sum(v) for k,v in trimmed.items()} 

输出:

{('20144', '4'): 18183.44, ('20144', '31'): 30965.4, ('20143', '31'): 5700.53, ('20144', '2'): 30266.6, ('20143', '4'): 52490.46}

举个例子,这就是在for循环之后trimmed样子:

{('20144', '4'): [12321.88, 5861.56], ('20144', '31'): [30965.4], ('20143', '4'): [52490.46], ('20144', '2'): [12911.5, 17355.1], ('20143', '31'): [5700.53]}

说明:

for循环遍历示例数据中的数据键( k )和键值( v )。 如果键(k[0],k[-1]) (即你的键元组中的第一个和最后一个值 - ('20144','4'):例如)在trimmed的新词典中不存在创建一个空白列表并附加值( v )。 如果密钥确实存在,则仅附加值。

trimmed后的字典完成后,简单的字典理解将所有这些列表相加。

编辑:

正如评论中所指出的,如果性能存在问题,您还可以使用collections defaultdict

from collections import defaultdict

trimmed=defaultdict(float)
for k,v in data.items(): 
    trimmed[(k[0],k[-1])]+=v

这里的值存储在trimmed trimmed defaultdict中新初始化的键将为0.0 然后你可以添加到位v

这可以为您提供所需的结果:

dict = {('20144', 'Bundesministerium f\xc3\xbcr Land- und Forstwirtschaft Umwelt und Wasserwirtschaft', 'Woman', '2'): 12911.5, ('20144', 'Wirtschaftskammer Tirol - Sparte Gewerbe und Handwerk Innung der Lebensmittelgewerbe', 'ORF Radio Tirol', '4'): 5861.56, ('20144', 'Bundesministerium f\xc3\xbcr Land- und Forstwirtschaft Umwelt und Wasserwirtschaft', 'Weekend Magazin', '2'): 17355.1, ('20144', 'Bundesministerium f\xc3\xbcr Wissenschaft Forschung und Wirtschaft', 'Die Presse', '31'): 30965.4, ('20144', 'Wirtschaftskammer \xc3\x96sterreich Fachverband der Telekommunikations- und Rundfunkunternehmungen', 'Bezirksrundschau Ober\xc3\xb6sterreich', '4'): 12321.88, ('20143', 'Wirtschaftskammer Nieder\xc3\xb6sterreich Fachgruppe Unternehmensberatung und Informationstechnologie N\xc3\x96', 'trend', '31'): 5700.53, ('20143', 'Bundesministerium f\xc3\xbcr Europa Integration und \xc3\x84u\xc3\x9feres', 'Kronen Zeitung', '4'): 52490.46}
sum_by_key = {}
filter_obj = None
for key, value in dict.items():
  sum_key = (key[0], key[-1])
  if sum_key in sum_by_key:
    sum_by_key[sum_key] += value
  else:
    sum_by_key[sum_key] = value

输出:

{('20144', '2'): 30266.6, ('20143', '31'): 5700.53, ('20144', '31'): 30965.4, ('20144', '4'): 18183.44, ('20143', '4'): 52490.46}

你可以使用itertools.groupby 看看下面的代码是否适合你(我用d作为你的dict)。

编辑:dict需要排序

fields = lambda k: (k[0], k[3])
for k, i in itertools.groupby(sorted(d, key=fields), key=fields):
    ...:     print(k, sum(d[v] for v in i))

('20143', '31') 5700.53
('20143', '4') 524.23
('20144', '2') 30266.6
('20144', '31') 30965.4
('20144', '4') 18183.44

以下是利用标准库中的defaultdict一次完成的方法:

import collections
output_dict = collections.defaultdict(float)
for key, value in input_dict.items():
    output_dict[ (key[0], key[-1]) ] += value


# show the output
print('\n'.join('%r: %r' % (key,value) for key, value in output_dict.items()))

打印如下:

('20144', '2'): 30266.6
('20143', '31'): 5700.53
('20144', '31'): 30965.4
('20144', '4'): 18183.44
('20143', '4'): 52490.46

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM