我如何比较列表中的元组中的字符串

时间:2018-01-20 16:18:40

标签: python string

我有这个元组列表[(amount, name)]

[(214.05, 'Charlie'), (153.57, 'Ben'),(213.88, 'Charlie')]

我试图通过他们的名字来比较它们,如果有一个具有相同名称的元组,我想将这些数量加在一起。

输出将进入另一个具有相同结构[(amount,name)]的列表。

我设法用这个提取名称部分:

for i in range(0, len(spendList)):
    print(spendList[i][1])

输出:

Charlie
Ben
Charlie

如何将名称相互比较?

4 个答案:

答案 0 :(得分:3)

text = [(214.05, 'Charlie'), (153.57, 'Ben'),(213.88, 'Charlie')]
dictionary = {}
for val in text:
    amount, name = val
    if name in dictionary:
        dictionary[name] += amount
    else:
        dictionary[name] = amount
print(*dictionary.items(),sep="\n")
>>('Charlie', 427.93)
  ('Ben', 153.57)

答案 1 :(得分:3)

执行这些操作的一种方法是使用dict.setdefault(),如:

代码:

data = [(214.05, 'Charlie'), (153.57, 'Ben'), (213.88, 'Charlie')]
summed = {}
for amount, name in data:
    summed.setdefault(name, []).append(amount)
summed = [(sum(amounts), name) for name, amounts in summed.items()]
print(summed)

这是如何工作的?

  1. 首先定义dict object以累积每个名称的金额。

    summed = {}
    
  2. 逐步浏览每一对金额和名称:

    for amount, name in data:
    
  3. 使用dict属性,哈希相同的内容将最终出现在dict的同一个插槽中,dict方法:setdefault()以确保dict我们遇到的每个名字都有一个空列表,为每个名称创建一个金额列表:

    summed.setdefault(name, []).append(amount)
    

    这会创建一个列表,如:

    {'Charlie': [214.05, 213.88], 'Ben': [153.57]}
    
  4. 最后使用comprehension我们可以sum()更新所有具有相同名称的项目。

    summed = [(sum(amounts), name) for name, amounts in summed.items()]
    
  5. 结果:

    [(427.93, 'Charlie'), (153.57, 'Ben')]
    

答案 2 :(得分:2)

首先对列表进行排序,然后使用带有小lambda函数的itertools.groupby

from itertools import groupby

lst = [(214.05, 'Charlie'), (153.57, 'Ben'),(213.88, 'Charlie')]
lst = sorted(lst, key=lambda x: x[1])

for k,v in groupby(lst, key = lambda x: x[1]):
    amount = sum(x[0] for x in v)
    print("Name: {}, Amount: {}".format(k, amount))

哪个收益

Name: Ben, Amount: 153.57
Name: Charlie, Amount: 427.93

或者,使用 dict理解 时更短:

summary = {name: amount 
            for name, v in groupby(lst, key = lambda x: x[1])
            for amount in [sum(x[0] for x in v)]}

print(summary)
# {'Charlie': 427.93, 'Ben': 153.57}

答案 3 :(得分:2)

您可以使用collections.defaultdict对每个名称的金额进行分组,然后在结尾处汇总金额:

from collections import defaultdict

data = [(214.05, 'Charlie'), (153.57, 'Ben'),(213.88, 'Charlie')]

d = defaultdict(list)
for amount, name in data:
    d[name].append(amount)

print([(_, sum(v)) for _, v in d.items()])
# [('Charlie', 427.93), ('Ben', 153.57)]