【问题标题】:Summing a list of lists of lists?总结列表列表的列表?
【发布时间】:2015-06-23 16:20:29
【问题描述】:

我正在尝试对 Python 中的列表列表求和,但我得到了错误的输出。我想要数字 36 作为我的答案,但我得到了每个括号的总和。

>>> list = [[[1,2],[3,4]],[[5,6],[7,8]]]
>>> for xs in list[0::1]:
...     for x in xs[0::1]:
...         sum(x)
...
3
7
11
15

【问题讨论】:

  • 请直接复制和粘贴代码(您可以选择并点击 control-K 或按{} 按钮进行格式化),而不是包含图像。
  • 我建议再看看你的数据结构,看看你是否可以简化或精简它。

标签: python list for-loop indexing sum


【解决方案1】:

您可能可以递归地执行此操作,这适用于任意深度的嵌套列表:

def add_all(l):
    try:
        return sum(add_all(i) for i in l)
    except TypeError:
        return l

print add_all([[[1,2],[3,4]],[[5,6],[7,8]]]) # 36

【讨论】:

  • 在 3.x 中,print(add_all([[[1,2],[3,4]],[[5,6],[7,8]]]))跨度>
【解决方案2】:

这里有一个更花哨的方法:

您可以使用itertools.chain 从列表列表中删除一级嵌套:

>>> lst = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]
>>> from itertools import chain
>>> list(chain(*lst)) # note: list != lst
[[1, 2], [3, 4], [5, 6], [7, 8]]

现在应用两次并对所有项目求和:

>>> sum(chain(*chain(*lst)))
36

【讨论】:

    【解决方案3】:

    你也可以像这样使用list comprehension -

    >>> lst = [[[1,2],[3,4]],[[5,6],[7,8]]]
    >>> sum([x for i in lst for y in i for x in y])
    36
    

    或者

    >>> sum(sum(y) for x in lst for y in x)
    36
    

    另外,仅供参考,list 是变量的错误名称,因为它会覆盖内置列表函数。


    如果有 n 个嵌套列表(任意数),我想不出通过 list comprehension 求和的方法,但是一个简单的递归算法可以解决问题 -

    >>> def sumOfList(element):
    ...     if isinstance(element, list):
    ...             return sum([sumOfList(x) for x in element])
    ...     elif isinstance(element, int):
    ...             return element
    ...
    >>> sumOfList([[[1,2,3,4],[1,2,3,4]],[1,2,3]])
    26
    

    【讨论】:

    • 你也可以使用sum(sum(y) for x in lst for y in x)。
    • 如果列表中有“n”个嵌套列表怎么办?
    • 那你就得用递归算法了,我会更新答案的。
    【解决方案4】:

    将子列表总和分配给变量:

    total = 0
    for x in list: # x is list of lists
      for y in x: # y is a list
         total = total + sum(y)
    print total
    

    【讨论】:

      猜你喜欢
      • 2012-11-26
      • 2012-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多