2014-09-05 102 views
-3

我已经从一个文件中导入数据,其编号如下: [[1,2,3,4,5] [2,4,6,8,10] [3,6,9,12,15]]在我的数组列表中只添加第一个值

我想知道如何只添加每行的第一个,第二个或第三个等。所以,例如,如果我添加每行的第三个数字,那么我的总数将是18(3 + 6 + 9)。

另外,我怎样才能显示这些数字在一维数组?

谢谢。

+3

你已经试过任何东西了吗?如果是这样,什么不起作用?你有没有收到任何错误讯息?我们希望提供帮助,但这不是让其他人为你工作的论坛。 – KSletmoe 2014-09-05 23:07:55

回答

-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] 

希望这有助于!

EDIT(基于该意见要求进一步修改):

所以基本上,你要通过列表的数量或行数来划分数的新创建的列表。以下几种方法可以帮助您做到这一点。

选项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 = map(lambda x: x/num_rows, sum_l) 
+0

太棒了!这就是我想要的。如果我想平均得到这个结果会怎么样?所以,我所说的是将每个数字除以3,因为有三组数字。所以,结果会打印出2,4,6,8,10。 – Jack 2014-09-06 00:04:11

+0

@JACK:我添加了可能有助于编辑的代码更改。希望它正是你正在寻找的。 – doubleo 2014-09-06 01:44:55

+0

@Jack:如果您使用Python 3.4或更高版本,则可以使用'statistics.mean'来代替'sum'。 (对于3.1-3.3,你也可以'安装统计数据'并使用它;它是最终成为stdlib'统计数据'的模块。[PyPI上还有很多其他统计模块](https://pypi.python .org/pypi?%3Aaction = search&term = statistics&submit = search),其中一些版本可用于Python 2.2或更早的版本。) – abarnert 2014-09-06 05:02:52

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
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] 
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) 
+0

感谢大家的帮助。 – Jack 2014-09-20 15:23:12

0

我想知道如何只添加第一条:您可以使用列表中理解

sum_l1 = [ x/num_rows for x in sum_l] 

OPTION 3完成它,或者每行的值,第二或第三等等。

这看起来像是一个工作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 
相关问题