python:如果列表中的值共享第一个单词,则对它们求和

zar*_*gar 5 python dictionary sum list

我有一个清单如下,

flat_list = ['hello,5', 'mellow,4', 'mellow,2', 'yellow,2', 'yellow,7', 'hello,7', 'mellow,7', 'hello,7']
Run Code Online (Sandbox Code Playgroud)

如果它们共享相同的单词,我想获得值的总和,所以输出应该是,

期望的输出:

l = [('hello',19), ('yellow', 9), ('mellow',13)]
Run Code Online (Sandbox Code Playgroud)

到目前为止,我已经尝试过以下操作,

new_list = [v.split(',') for v in flat_list]

d = {}
for key, value in new_list:
   if key not in d.keys():
      d[key] = [key]
   d[key].append(value)

# getting rid of the first key in value lists
val = [val.pop(0) for k,val in d.items()]
# summing up the values
va = [sum([int(x) for x in va]) for ka,va in d.items()]
Run Code Online (Sandbox Code Playgroud)

但是由于某种原因,最后的总结不起作用,我没有得到我想要的输出

hir*_*ist 9

这是使用以下方法实现目标的变体defaultdict

from collections import defaultdict

t = ['hello,5', 'mellow,4', 'mellow,2', 'yellow,2',
     'yellow,7', 'hello,7', 'mellow,7', 'hello,7']

count = defaultdict(int)

for name_number in t:
    name, number = name_number.split(",")
    count[name] += int(number)
Run Code Online (Sandbox Code Playgroud)

您还可以使用Counter

from collections import Counter

count = Counter()

for name_number in t:
    name, number = name_number.split(",")
    count[name] += int(number)
Run Code Online (Sandbox Code Playgroud)

list在这两种情况下,您都可以使用以下命令将输出转换为 a of tuples:

list(count.items())
# -> [('hello', 19), ('mellow', 13), ('yellow', 9)]
Run Code Online (Sandbox Code Playgroud)

我运行了您的代码,确实得到了正确的结果(尽管不是您想要的格式)。