总和功能不起作用

时间:2013-11-24 04:49:55

标签: python list sum list-comprehension

我正在尝试编写一个程序,它将列表奇数列中的整数相加

def sum_of_odd_cols(x):
    for j in range(len(x)):
        odds=[x[k][j] for k in range(len(x)) if j%2!=0]
    return sum(odds)

x=[[1,2,5],[3,4,6],[7,8,9]]
print(sum_of_odd_cols(x))

我从中得到的是“0”,为什么会发生这种情况?

还有一个问题

x=[[1,2,5],[3,4,6],[7,8,9]]
for j in range(len(x)):
    col=[column[j] for column in x]

这似乎也创建了列表x中列的列表,但是我不明白它是如何工作的 'column'是python中的内置函数吗?

5 个答案:

答案 0 :(得分:0)

你可以做到

x = [[1,2,5],[3,4,6],[7,8,9]]    # Generate the list
sum([sum(k[1::2]) for k in x])   # Sum the numbers in odd columns
# 14

如果您需要奇数列中所有数字的组合总和。

答案 1 :(得分:0)

如果你对NumPy感到满意:

import numpy as np

a = np.array([[1,2,3], [1,2,3]])

b = np.sum(a[:,::2], axis=0)   # column 0, 2, ...
# b = [2, 6]
b = np.sum(a[:,::2])
# b = 8

c = np.sum(a[:,1::2], axis=0)  # column 1, 3, ...

答案 2 :(得分:0)

怎么样:

def sum_of_odd_cols(x):
    oddsum = 0
    for j in range(len(x)):
        oddsum += sum([x[k][j] for k in range(len(x)) if j%2!=0])
    return oddsum

x=[[1,2,5],[3,4,6],[7,8,9]]
print(sum_of_odd_cols(x))

这可能不是最好的方法,但它会使你的代码正常工作。在循环的每次迭代中,odds变量被新列表覆盖,并且由于最后一列为空(它的索引是偶数),因此总和始终为0.。

答案 3 :(得分:0)

它返回0的原因是因为你的odds数组在for循环结束时为空;因为在循环的每次迭代中,您都要重置odds。如果你用'long'方式编写循环,它将返回正确的结果:

odds = []
for j in range(len(x)):
   for k in range(len(x)):
      if j % 2 != 0:
         odds.append(x[k][j])

如果我添加一些打印语句,就会发生这种情况:

j is: 0
k is: 0
k is: 1
k is: 2
j is: 1
k is: 0
Adding: 2 to odds
k is: 1
Adding: 4 to odds
k is: 2
Adding: 8 to odds
j is: 2
k is: 0
k is: 1
k is: 2
>>> odds
[2, 4, 8]

对于问题的第二部分:

  

还有一个问题

     

x = [[1,2,5],[3,4,6],[7,8,9]] j在范围内(len(x)):       col = [[x]列中的列[j]

     

这似乎也创建了列表x中列的列表,但是我   不明白这是如何工作的'列'是一个内置的功能   蟒?

不,这是list comprehension,是构建列表的简便方法。

循环实际上是:

col = []
for column in x:
   col.append(column[j])

j是其他变量(在理解之上设置)。

答案 4 :(得分:0)

您的第一个问题已经被多次回答。

关于你的第二个问题,考虑解压缩你的嵌套列表(假设它没有破烂):

>>> x=[[1,2,5],[3,4,6],[7,8,9]]
>>> [x for x in zip(*x)]
[(1, 3, 7), (2, 4, 8), (5, 6, 9)]

这会为您提供一个包含列的列表。

如果元组出现问题且您需要列表中的列表,请使用内置list

>>> [list(x) for x in zip(*x)]
[[1, 3, 7], [2, 4, 8], [5, 6, 9]]

所以基本上你的两个问题归结为:

def sum_of_odd_cols(x):
    return sum(sum(x[1::2]) for x in x)

def rows_to_columns(x):
    return [list(x) for x in zip(*x)]