我正在尝试编写一个程序,它将列表奇数列中的整数相加
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中的内置函数吗?
答案 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)]