【问题标题】:How can i add the numbers of tuples from different lists of a a list in Python? [closed]如何从 Python 中的列表的不同列表中添加元组的数量? [关闭]
【发布时间】:2020-04-11 11:27:24
【问题描述】:

这就是我所拥有的(在 python 版本 3.7.4 中):

P= [[('Lista-A', 1), ('Lista-X', 1), ('Lista-Z', 4)], [('Lista-A', 2), ('Lista-X', 0), ('Lista-Z', 1)], [('Lista-A', 5), ('Lista-X', 1), ('Lista-Z', 0)], [('Lista-A', 0), ('Lista-X', 1), ('Lista-Z', 4)]]

我正在尝试将与“Lista-A”、“Lista-X”和“Lista-Z”关联的所有数字相加,以便得到类似的结果(只是一个总和为的元组列表与每个“Lista”相关的数字):

[('Lista-A', 8), ('Lista-X', 3), ('Lista-Z', 9)]

我尝试过使用 for 循环,但没有成功。

for lista in P:
        for i in lista: 

我不知道如何继续代码...有人可以帮我吗? 提前致谢!

【问题讨论】:

  • 请编辑您的帖子并在 for cycle 中包含您的尝试
  • 完成!不知道它是否有帮助,因为我真的不知道在 for 循环下放什么
  • “我不知道如何编码”不是 Stack Overflow 问题。您的代码中没有任何内容试图对列表元素求和。 On topichow to ask 和 ...the perfect question 在此处申请。如果您不知道如何识别和总结事物,请考虑阅读有关分组、排序和求和的教程。如果您确实知道,那么请诚实地尝试并发布。
  • 我同意@Prune,我建议学习更多关于一般编程的知识。

标签: python python-3.7


【解决方案1】:

如果“列表名称”的顺序始终相同,您可以使用zipsum 的列表推导来做到这一点:

>>> data = [[('Lista-A', 1), ('Lista-X', 1), ('Lista-Z', 4)], [('Lista-A', 2), ('Lista-X', 0), ('Lista-Z', 1)], [('Lista-A', 5), ('Lista-X', 1), ('Lista-Z', 0)], [('Lista-A', 0), ('Lista-X', 1), ('Lista-Z', 4)]]
>>> [(col[0][0], sum(x for _, x in col)) for col in zip(*data)]
[('Lista-A', 8), ('Lista-X', 3), ('Lista-Z', 9)]

zip(*data) 是从“行”列表中迭代“列”的标准方法。假设列确实排成一行,那么每一列都包含要为相同的“列表名称”求和的所有数字。 sum 函数将数字相加;这些列包含我们想要对第二个组件中的数字求和的元组,因此解构分配_, x

【讨论】:

    【解决方案2】:

    这应该可以工作

    from collections import defaultdict
    
    input = [[('Lista-A', 1), ('Lista-X', 1), ('Lista-Z', 4)], [('Lista-A', 2), ('Lista-X', 0), ('Lista-Z', 1)], [('Lista-A', 5), ('Lista-X', 1), ('Lista-Z', 0)], [('Lista-A', 0), ('Lista-X', 1), ('Lista-Z', 4)]]
    
    d = defaultdict(int)
    for i in input:
        for j in i:
            d[j[0]] += j[1]
    
    res = list(d.items())
    

    【讨论】:

    • 我试图用“for循环”来做一些更简单的事情,但是谢谢!!
    • @AnaLuizaTavares 你有一个嵌套列表。使用单个for“循环”对您没有多大帮助...
    【解决方案3】:

    不是最优雅的“pythonic”方式,而是使用您的代码

    new_lista = {}
    for lista in p:
        for i in lista: 
            new_lista[i[0]] = new_lista.get(i[0], 0) + i[1]
    
    p1 = [(k,v) for k,v in new_lista.items()]
    

    【讨论】:

      【解决方案4】:

      导入后的一个可怕的单行,但它成功了!

      >>> from functools import reduce
      >>> reduce(lambda x, y: dict((k, v + y[k]) for k, v in x.items()), [dict(i) for i in input])
      {'Lista-A': 8, 'Lista-X': 3, 'Lista-Z': 9}
      

      【讨论】:

        猜你喜欢
        • 2019-04-28
        • 1970-01-01
        • 2021-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多