【问题标题】:How to sum values of tuples that have same name in Python如何在Python中对具有相同名称的元组的值求和
【发布时间】:2015-07-15 12:27:30
【问题描述】:

我有以下列表,其中包含必须值的元组:

mylist=[(3, 'a'), (2, 'b'), (4, 'a'), (5, 'c'), (2, 'a'), (1, 'b')]

有没有办法对所有同名的值求和? 比如:

(9, 'a'), (3, 'b'), (5, 'c')

我尝试使用 for 循环迭代元组,但无法得到我想要的。

谢谢

【问题讨论】:

  • 你能展示你的迭代尝试吗?这并不难,除非你想变得非常pythonic。
  • 我丢失了在 IDLE 上使用的代码,因为我只是在做一些尝试。无论如何,我必须使用一些 for 循环来查找任何相似性(例如 if x == x),但它没有用。如果你觉得我的问题很愚蠢,我很抱歉,不过我真的是 Python 新手 :)
  • 使用 Microsoft Excel 数据透视表 ;)

标签: python sum tuples


【解决方案1】:

使用 dict(或 defaultdict)来聚合你的元组:

from collections import defaultdict
mylist=[(3, 'a'), (2, 'b'), (4, 'a'), (5, 'c'), (2, 'a'), (1, 'b')]
sums = defaultdict(int)
for i, k in mylist:
    sums[k] += i   

print sums.items()
# output: [('a', 9), ('c', 5), ('b', 3)]

# Or if you want the key/value order reversed and sorted by key
print [(v, k) for (k, v) in sorted(sums.items())]
# output: [(9, 'a'), (3, 'b'), (5, 'c')]

【讨论】:

  • 输出不是 OP 想要的。
  • 我专门回答了“有没有办法对所有具有相同名称的值求和?”这个问题。我认为反转列表中的键/值是微不足道的,但我更新了我的示例以包含它(并对它们进行排序)。
  • 我并不关心列表中键/值的顺序。感谢您的建议,它帮助我更好地理解了 Python。
【解决方案2】:

您可以使用itertools.groupby(按每个元组的第二个值排序后)创建组。然后对于每个组,对每个元组中的第一个元素求和,然后在列表推导中为每个组创建一个元组。

>>> import itertools
>>> [(sum(i[0] for i in group), key) for key, group in itertools.groupby(sorted(mylist, key = lambda i: i[1]), lambda i: i[1])]
[(9, 'a'), (3, 'b'), (5, 'c')]

【讨论】:

  • 谢谢,这工作正常。我更喜欢使用一些更“pythonic”的方式,但这对我来说似乎是最好的选择。谢谢
  • 使用sortedgroupyby 在性能方面是错误的。正确的方法是给我们一个 defaultdict
【解决方案3】:

没有任何依赖的简单方法:

mylist = [(3, 'a'), (2, 'b'), (4, 'a'), (5, 'c'), (2, 'a'), (1, 'b')]

sums = {}
for a, b in mylist:
    if b not in sums: sums[b] = a
    else: sums[b] += a

print list(sums.items())

【讨论】:

  • 谢谢你,我喜欢你的建议。但它给了我回溯(最近一次调用最后一次):文件“”,第 6 行,在 print (list(sums.item())) AttributeError: 'dict' object has no attribute 'item ' 我没有得到什么?
  • 好像你打错字了,试试sums.items()s
  • @Niccolò:确定你写的是“items”而不是“item”?!
  • 是的,你是对的,我的错!我输入的项目没有“s”。
【解决方案4】:

您可以创建一个dict,其中包含各个键的总和。

>>> my_dict = {}
>>> for item in mylist:
...     my_dict[item[1]] = my_dict.get(item[1], 0) + item[0]
>>> [(my_dict[k], k) for k in my_dict]
[(9, 'a'), (5, 'c'), (3, 'b')]

【讨论】:

    猜你喜欢
    • 2018-06-15
    • 2021-08-09
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    • 2020-10-25
    • 2019-06-25
    • 1970-01-01
    相关资源
    最近更新 更多