如何统一处理列表或列表列表(多维列表)

时间:2012-02-28 03:02:22

标签: python

没有像numpy这样的重型库,我想在我的代码中统一处理单个列表或多维列表。例如,函数sum_up(list_or_matrix)应该 参数[1,2,3]返回6,[[1,2,3],[1,2,0]]返回9。

我的问题是: 1.我可以在没有明确检测输入维度的情况下进行编码,例如isinstance(arg [0],(tuple,list))?

2.如果我必须这样做,是否有任何优雅的方法来检测列表的维度(列表的列表......),例如,递归?

5 个答案:

答案 0 :(得分:1)

作为many users suggested,你总是可以使用dict而不是list来进行任意维度的收集。字典接受元组作为参数,因为它们是可以清除的。因此,您可以轻松填写​​您的收藏,如

>>> m = {}
>>> m[1] = 1
>>> m[1,2] = 12
>>> m[1,2,"three",4.5] = 12345
>>> sum(m.values()) #better use m.itervalues() in python 2.* 
12358

答案 1 :(得分:1)

您可以使用递归解决此问题,如下所示:

#!/usr/bin/env python

def sum(seq_or_elem):
  if hasattr(seq_or_elem, '__iter__'):
    # We were passed a sequence so iterate over it, summing the elements.
    total = 0
    for i in seq_or_elem:
      total += sum(i)
    return total
  else:
    # We were passed an atomic element, the sum is identical to the passed value.
    return seq_or_elem

测试:

>>> print(sum([1, 2, [3, [4]], [], 5]))
15

答案 2 :(得分:0)

如果您打算使用单一功能来总结您的列表sum_up(list_or_matrix),那么我看不出办法。

如果你有list of lists,我只能想象你需要遍历列表以查明它是1-D还是2-D列表。无论如何,循环中有什么问题?

def sum_up(matrix):
    2DMatrix = False
    for item in matrix:
        if type(item) == list:
            2DMatrix = True

    if(2DMatrix):
        //sum 2d matrix
    else:
        //sum 1d matrix

答案 3 :(得分:0)

你可以递归求和,直到你有一个标量值:

def flatten(x):
    if isinstance(x, list):
        return sum(map(flatten, x))
    return x

注意:您可以使用collections.Iterable(或其他基类)代替list,具体取决于您要展平的内容。

答案 4 :(得分:0)

总结矩阵的简单方法如下:

def sum_up(matrix):
    if isinstance(matrix, (tuple, list)):
        return sum(matrix)
    else:
        return sum((sum(x) for x in matrix))

'else'分支使用list comprehension,这是一个功能强大且快速的工具。