一个dict的Python求和元素(如果具有相似的键(元组))

2024-10-03 09:12:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一本这样的字典:

{('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)和末尾有相同数字(例如231)的所有值求和。你知道吗

我曾考虑过听写理解,但我正在努力比较我需要的关键。我怎样比较它们?你知道吗


Tags: 字典数字landderundsterreichbundesministeriumwasserwirtschaft
3条回答

您可以使用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

解决方案:

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}

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

{('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字典之后,一个简单的字典理解将所有这些列表相加。你知道吗

编辑:

正如在注释中指出的,如果性能有问题,您也可以使用来自collectionsdefaultdict

from collections import defaultdict

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

这里的值存储在trimmedtrimmeddefaultdict中新初始化的键将是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}

相关问题 更多 >