列表列表的总和;返回总和列表
- 2025-03-11 08:52:00
- admin 原创
- 36
问题描述:
让data = [[3,7,2],[1,4,5],[9,8,7]]
假设我想对列表中每个列表的索引元素求和,例如将矩阵列中的数字相加以获得单个列表。我假设数据中的所有列表长度相等。
print foo(data)
[[3,7,2],
[1,4,5],
[9,8,7]]
_______
>>>[13,19,14]
如何迭代列表列表而不出现索引超出范围错误?也许使用 lambda?谢谢!
解决方案 1:
你可以尝试这个:
In [9]: l = [[3,7,2],[1,4,5],[9,8,7]]
In [10]: [sum(i) for i in zip(*l)]
Out[10]: [13, 19, 14]
zip
它使用和的组合*
来解压列表,然后根据索引压缩项目。然后使用列表推导来迭代相似索引的组,对它们求和并返回它们的“原始”位置。
为了使其更加清晰,以下是迭代时发生的情况zip(*l)
:
In [13]: for i in zip(*l):
....: print i
....:
....:
(3, 1, 9)
(7, 4, 8)
(2, 5, 7)
对于长度不一致的列表,您可以使用itertools.izip_longest
-fillvalue
这0
基本上用填充缺失的索引0
,从而允许您对所有“列”求和:
In [1]: import itertools
In [2]: l = [[3,7,2],[1,4],[9,8,7,10]]
In [3]: [sum(i) for i in itertools.izip_longest(*l, fillvalue=0)]
Out[3]: [13, 19, 9, 10]
在这种情况下,迭代看起来是这样izip_longest
的:
In [4]: for i in itertools.izip_longest(*l, fillvalue=0):
...: print i
...:
(3, 1, 9)
(7, 4, 8)
(2, 0, 7)
(0, 0, 10)
解决方案 2:
对于任何矩阵(或其他雄心勃勃的数字)运算,我建议研究 NumPy。
解决问题中沿轴显示的数组总和的示例是:
>>> from numpy import array
>>> data = array([[3,7,2],
... [1,4,5],
... [9,8,7]])
>>> from numpy import sum
>>> sum(data, 0)
array([13, 19, 14])
这是 numpy 的 sum 函数的文档:http://docs.scipy.org/doc/numpy/reference/generated/numpy.sum.html#numpy.sum
特别是第二个参数很有趣,因为它可以轻松指定应该总结的内容:所有元素或仅潜在的 n 维数组的特定轴(如)。
解决方案 3:
这将给出每个子列表的总和
data = [[3,7,2],[1,4],[9,8,7,10]]
list(map(sum, data))
[12, 5, 34]
如果你想对所有元素求和并只得到一个总和,那么请使用这个
data = [[3,7,2],[1,4],[9,8,7,10]]
sum(sum(data, []))
51
解决方案 4:
>>> data = [[1, 2, 3], [1, 2, 3], [1, 2, 3]]
>>> for column in enumerate(data[0]):
... count = sum([x[column[0]] for x in data])
... print 'Column %s: %d' % (column[0], count)
...
Column 0: 3
Column 1: 6
Column 2: 9
解决方案 5:
import numpy as np
l = [[3,7,2],[1,4,5],[9,8,7]]
print(sum(np.array(l)[:,:]))
print(sum(np.array(l)[:,0:2]))
#answer:
#[13 19 14]
#[13 19]
# use np like row column
解决方案 6:
这确实取决于您对所有内部列表(或行)长度相同的假设,但它应该按照您想要的方式进行:
sum_list = []
ncols = len(data[0])
for col in range(ncols):
sum_list.append(sum(row[col] for row in data))
sum_list
Out[9]: [13, 19, 14]
解决方案 7:
def sum(L):
res = list()
for j in range(0,len(L[0])):
tmp = 0
for i in range(0,len(L)):
tmp = tmp + L[i][j]
res.append(tmp)
return res
解决方案 8:
此解决方案假设一个方阵,并使用两个 for 循环遍历列和行,在此过程中逐列添加。结果以列表形式返回。
def foo(data):
# initialise length of data(n) and sum_of_col variable
n = len(data)
sum_of_col = []
# iterate over column
for col_i in range(n):
# column sum
col_count = 0;
#iterate over row
for row_i in range(n):
col_count += data[row_i][col_i]
# append sum of column to list
sum_of_col.append(col_count)
return sum_of_col
解决方案 9:
对长度不同或相同的列表求和的最简单的解决方案是:
total = 0
for d in data:
total += sum(d)
一旦你理解了列表理解,你可以缩短它:
sum([sum(d) for d in data])
解决方案 10:
对于数据是字符串列表的列表的情况。按元素对字符串列表的列表求和或连接。
>>> a = [list('abc'),list('def'),list('tyu')]
>>> a
[['a', 'b', 'c'], ['d', 'e', 'f'], ['t', 'y', 'u']]
>>> [''.join(thing) for thing in zip(*a)]
['adt', 'bey', 'cfu']
>>>
解决方案 11:
numArr = [[12, 4], [1], [2, 3]] sumArr = 0 sumArr = sum(sum(row) for row in numArr) print(sumArr) the answere: 22
我所做的:当你像这样执行“for”时例如:[row.append(1) for row in numArr] 列表将更改为:[[12, 4, 1], [1, 1], [2, 3, 1]] 我使用了 python 中的函数 sum(),该函数获取列表并对其进行迭代,然后得出列表中所有数字的总和。当我执行 sum(sum()) 时,我得到了大列表中所有列表的总和。