【问题标题】:Python 2.x: Summing items in a list of tuplesPython 2.x:对元组列表中的项目求和
【发布时间】:2016-03-15 18:32:32
【问题描述】:

出于求和的目的,我创建了一个元组列表,其中列表中的多个项目具有相同的第一个变量。 例如:

    x = [('m32',[1,2,3]),('m32',[2,3,4]),('m32',[4,5,6]),('m33',[1,2,3]),('m33',[2,3,4]),('m33',[4,5,6]),('m34',[1,2,3]),('m34',[2,3,4]),('m34',[4,5,6])....]

我想为具有相同第一项的所有值(即 'm32 ')。

换句话说,对于所有标记为“m32”的项目,我希望能够添加其他值。

我如何对它进行切片/索引以循环并执行求和?

【问题讨论】:

  • 您应该通过点击“箭头”来接受答案,这会将问题从“未回答的问题列表”中删除

标签: list python-2.7 indexing tuples slice


【解决方案1】:

一些棘手的zip 魔术,以及itertools.groupby 将匹配的第一个项目组合在一起:

>>> x = [('m32',[1,2,3]),('m32',[2,3,4]),('m32',[4,5,6]),('m33',[1,2,3]),('m33',[2,3,4]),('m33',[4,5,6]),('m34',[1,2,3]),('m34',[2,3,4]),('m34',[4,5,6])]
>>> from itertools import groupby
>>> from operator import itemgetter
>>> for k,g in groupby(x,key=itemgetter(0)):
...  print (k,[sum(i) for i in zip(*zip(*g)[1])])
...
('m32', [7, 10, 13])
('m33', [7, 10, 13])
('m34', [7, 10, 13])

它是如何工作的细分:

g 是具有匹配键的项目组。 zip(*g) 转置矩阵,将键和值放在一起:

>>> for k,g in groupby(x,key=itemgetter(0)):
...  print zip(*g)
...
[('m32', 'm32', 'm32'), ([1, 2, 3], [2, 3, 4], [4, 5, 6])]
[('m33', 'm33', 'm33'), ([1, 2, 3], [2, 3, 4], [4, 5, 6])]
[('m34', 'm34', 'm34'), ([1, 2, 3], [2, 3, 4], [4, 5, 6])]

获取第二个项目:

>>> for k,g in groupby(x,key=itemgetter(0)):
...  print zip(*g)[1]
...
([1, 2, 3], [2, 3, 4], [4, 5, 6])
([1, 2, 3], [2, 3, 4], [4, 5, 6])
([1, 2, 3], [2, 3, 4], [4, 5, 6])

再次转置以匹配要求和的项目:

>>> for k,g in groupby(x,key=itemgetter(0)):
...  print zip(*zip(*g)[1])
...
[(1, 2, 4), (2, 3, 5), (3, 4, 6)]
[(1, 2, 4), (2, 3, 5), (3, 4, 6)]
[(1, 2, 4), (2, 3, 5), (3, 4, 6)]

然后把它们加起来:

>>> for k,g in groupby(x,key=itemgetter(0)):
...  print [sum(i) for i in zip(*zip(*g)[1])]
...
[7, 10, 13]
[7, 10, 13]
[7, 10, 13]

【讨论】:

  • 这太棒了!但是,正如 rsm 指出的那样,即使有解释,这也有点超出我和我的理解水平。谢谢,我希望其他人觉得它有用。
【解决方案2】:

Mark 给出的答案很棒,而且可能比我发布给你的答案更有效率。但是我仍然想发布我的答案,因为您可能是 python 新手,并且您很容易理解它。

对于这种脚本,您只需要一些想象力和基本的 Python 概念:

dictionary={}
for name, numbers in x:
    if name in dictionary:
        current_list=dictionary[name]

        for i in range(3):
            current_list[i]+=numbers[i]

    else:
        dictionary[name]=numbers

print(dictionary)

请注意,输出是一个字典: {'m32': [7, 10, 13], 'm33': [7, 10, 13]}..

希望对你有帮助!

【讨论】:

  • 你说得对,这更符合我的要求。有没有办法在不创建字典的情况下做到这一点?稍后我需要循环遍历“键”以获得格式化的输出。或者你可以做“字典中的键:....”之类的事情吗?
  • 如果使用列表列表会更容易,还是不将元组放在列表中?
  • @catalyst123 使用字典真的很有用,你可以直接获取它的值,或者键例如for key in dictionary.keys(),或者直接获取列表for value in dictonary.values(),甚至同时获取for key, value in dictonary.items()
猜你喜欢
  • 2018-05-17
  • 1970-01-01
  • 1970-01-01
  • 2017-05-24
  • 2021-06-16
  • 2018-03-05
  • 1970-01-01
  • 2016-02-27
  • 1970-01-01
相关资源
最近更新 更多