我从包含以下数字的文件导入数据: [[1,2,3,4,5] [2,4,6,8,10] [3,6,9,12,15-]]
我想知道如何只从每行添加第一个,第二个或第三个等等。所以,例如,如果我从每一行添加第三个数字,那么我的总数将是18(3 + 6 + 9)。
另外,如何在一维数组中显示这些数字?
感谢。
答案 0 :(得分:2)
l = [[1,2,3,4,5] ,[2,4,6,8,10],[3,6,9,12,15]]
print sum(x[2] for x in l)
18
要将它们放入列表中,只需使用列表解析:
l2 = [x[2] for x in l]
print sum(l2),l2
18 [3, 6, 9]
答案 1 :(得分:0)
您可以使用numpy
库为您执行此操作。 sum
函数默认会按列添加。
import numpy as np
l = [[1,2,3,4,5], [2,4,6,8,10], [3,6,9,12,15]]
>>> np.array(l)
array([[ 1, 2, 3, 4, 5],
[ 2, 4, 6, 8, 10],
[ 3, 6, 9, 12, 15]])
>>> sum(np.array(l))
array([ 6, 12, 18, 24, 30])
答案 2 :(得分:0)
此功能不会检查您的列表是否至少为n长度,但我认为您可能会得到这个想法:
def add_nth_members(my_list, n):
sum_list = [x[n-1] for x in my_list]
print sum_list
return sum(sum_list)
答案 3 :(得分:0)
我想知道如何只从每行添加第一个,第二个或第三个等等。
这看起来像是zip
的工作!
zip
函数将“转置”您的列表列表,因此您将获得第一个所有第一个值,然后是所有第二个值的列表,依此类推。它可能比理解描述更容易,所以:
>>> l = [[1,2,3,4,5], [2,4,6,8,10], [3,6,9,12,15]]
>>> list(zip(*l))
[(1, 2, 3), (2, 4, 6), (3, 6, 9), (4, 8, 12), (5, 10, 15)]
这使得任何特定索引的总和变得容易:
>>> zl = list(zip(*l))
>>> sum(zl[0])
6
>>> zum(zl[2])
18
......或者所有这些:
>>> [sum(i) for i in zip(*l)]
[6, 12, 18, 24, 30]
或者,如果您愿意:
>>> list(map(sum, zip(*l)))
[6, 12, 18, 24, 30]
值得抓住zip
,因为这会让很多难题变得容易。
例如,比较这两个执行相同操作的列表推导:
>>> [sum(i) for i in zip(*l)]
[6, 12, 18, 24, 30]
>>> [sum(i[n] for i in l) for n in range(len(l[0]))]
[6, 12, 18, 24, 30]
除了更加紧凑和可读,并且更难以出错之外,如果列表的长度不同,zip
版本也可以让您做正确的事情。嗯,“正确的事情”对于不同的情况是不同的,但一般来说,要么你想要在最短的时候停止,要么“填写”最短的,不要得到你不理解的神秘异常。比较:
>>> l = [[1, 2, 3], [4, 5]]
>>> [sum(i) for i in zip(*l)]
[5, 7]
>>> import itertools
>>> [sum(i) for i in zip_longest(*l, fillvalue=0)]
[5, 7, 3]
>>> [sum(i[n] for i in l) for n in range(len(l[0]))]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <listcomp>
File "<stdin>", line 1, in <genexpr>
IndexError: list index out of range
答案 4 :(得分:-1)
l = [[1,2,3,4,5] ,[2,4,6,8,10],[3,6,9,12,15]]
如果您想单独打印总和,
print sum(l_item[0] for l_item in l)
哪个会打印:
6
如果您想要一个包含结果的列表:
#Assuming all the sub lists have same length
num_rows = len(l)
num_cols = len(l[0])
sum_l = []
for i in range(0, num_cols):
cur_sum = 0
for j in range(0, num_rows):
cur_sum += l[j][i]
sum_l.append(cur_sum)
print sum_l
哪个会打印:
[6, 12, 18, 24, 30]
希望这有帮助!
编辑(基于评论中要求的进一步更改):
所以基本上,你想要按照列表数量或行数划分新创建的数字列表。这里有几种方法可以做到这一点。
选项1:在for循环中执行此操作。
for i in range(0, num_cols):
cur_sum = 0
for j in range(0, num_rows):
cur_sum += l[j][i]
cur_sum /= num_rows
sum_l.append(cur_sum)
选项2:您可以使用列表推导来完成它
sum_l1 = [ x/num_rows for x in sum_l]
选项3:使用地图功能
sum_l1 = map(lambda x: x/num_rows, sum_l)