没有像numpy这样的重型库,我想在我的代码中统一处理单个列表或多维列表。例如,函数sum_up(list_or_matrix)应该 参数[1,2,3]返回6,[[1,2,3],[1,2,0]]返回9。
我的问题是: 1.我可以在没有明确检测输入维度的情况下进行编码,例如isinstance(arg [0],(tuple,list))?
2.如果我必须这样做,是否有任何优雅的方法来检测列表的维度(列表的列表......),例如,递归?
答案 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,这是一个功能强大且快速的工具。