gpt4 book ai didi

python - 对管道分隔列表进行分组和总计

转载 作者:太空宇宙 更新时间:2023-11-04 10:44:56 25 4
gpt4 key购买 nike

我有一个看起来很可笑的列表,就像这样。

[['Biking', '10'], ['Biking|Gym', '14'], ['Biking|Gym|Hiking', '9'], ['Biking|Gym|Hiking|Running', '27']]

我想把它变成 ['Type', total, %] 的格式,像这样:

[['Biking',60,'34.7%'],['Gym',50,'28.9%'],['Hiking',36,'20.8%'],['Running',27,'15.6%']]

我确定我正在以最困难的方式进行此操作 - 有人可以为我指明更好的方向吗?我之前使用过 itertools.groupby,这似乎是一个适合它的地方,但我不确定如何在这种情况下实现。

# TODO: This is totally ridiculous.
running = 0
hiking = 0
gym = 0
biking = 0
no_exercise = 0

for r in exercise_types_l:
if 'Running' in r[0]:
running += int(r[1])
if 'Hiking' in r[0]:
hiking += int(r[1])
if 'Gym' in r[0]:
gym += int(r[1])
if 'Biking' in r[0]:
biking += int(r[1])
if 'None' in r[0]:
no_exercise += int(r[1])

total = running + hiking + gym + biking + no_exercise

l = list()
l.append(['Running', running, '{percent:.1%}'.format(percent=running/total)])
l.append(['Hiking', hiking, '{percent:.1%}'.format(percent=hiking/total)])
l.append(['Gym', gym, '{percent:.1%}'.format(percent=gym/total)])
l.append(['Biking', biking, '{percent:.1%}'.format(percent=biking/total)])
l.append(['None', no_exercise, '{percent:.1%}'.format(percent=no_exercise/total)])

l = sorted(l, key=lambda r: r[1], reverse=True)

最佳答案

给定一个初始列表,例如

>>> test_list = [['Biking', '10'], ['Biking|Gym', '14'], ['Biking|Gym|Hiking', '9'], ['Biking|Gym|Hiking|Running', '27']]

您可以先编写一个defaultdict 来对值求和(获取最终结果的第二个元素),例如

>>> from collections import defaultdict
>>> final_dict = defaultdict(int)
>>> for keys, values in test_list:
for elem in keys.split('|'):
final_dict[elem] += int(values)


>>> final_dict
defaultdict(<type 'int'>, {'Gym': 50, 'Biking': 60, 'Running': 27, 'Hiking': 36})

然后,您可以使用列表理解来获得最终结果。

>>> final_sum = float(sum(final_dict.values()))
>>> [(elem, num, str(num/final_sum)+'%') for elem, num in final_dict.items()]
[('Gym', 50, '0.28901734104%'), ('Biking', 60, '0.346820809249%'), ('Running', 27, '0.156069364162%'), ('Hiking', 36, '0.208092485549%')]

因为,您希望对它们进行排序和格式化,将最终结果更改为。

>>> [(elem, num, '{:.1%}'.format(num/final_sum)) for elem, num in final_dict.items()]
[('Gym', 50, '28.9%'), ('Biking', 60, '34.7%'), ('Running', 27, '15.6%'), ('Hiking', 36, '20.8%')]
>>> from operator import itemgetter
>>> sorted([(elem, num, '{:.1%}'.format(num/final_sum)) for elem, num in final_dict.items()], key = itemgetter(1), reverse=True)
[('Biking', 60, '34.7%'), ('Gym', 50, '28.9%'), ('Hiking', 36, '20.8%'), ('Running', 27, '15.6%')]

关于python - 对管道分隔列表进行分组和总计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18085898/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com