附加到列表中的空列表以转置矩阵,仅保留最后一个值

时间:2018-01-21 15:29:01

标签: python append

这是问题:

spam=[[1,2,3,'a'],
      [4,5,6,'b'],
      [7,8,9,'c']]
for j in range(len(spam)):
    for i in range(len(spam[0])):
        bacon0=[[] for n in range(len(spam[0]))]
        bacon0[i].append(spam[j][i])

我希望输出如下:

bacon0=[[1,4,7],[2,5,8],[3,6,9],['a','b','c']]

但我得到了:

bacon0=[[],[],[],['c']]

我想转置矩阵但不使用numpyzip()

1 个答案:

答案 0 :(得分:0)

您在内循环的每次迭代中重新创建bacon0

for j in range(len(spam)):
    for i in range(len(spam[0])):
        bacon0=[[] for n in range(len(spam[0]))]

每次都替换以前的版本。在循环之前将其移出

bacon0 = [[] for n in range(len(spam[0]))]
for j in range(len(spam)):
    for i in range(len(spam[0])):

演示:

>>> spam=[[1,2,3,'a'],
...       [4,5,6,'b'],
...       [7,8,9,'c']]
>>> bacon0 = [[] for n in range(len(spam[0]))]
>>> for j in range(len(spam)):
...     for i in range(len(spam[0])):
...         bacon0[i].append(spam[j][i])
...
>>> bacon0
[[1, 4, 7], [2, 5, 8], [3, 6, 9], ['a', 'b', 'c']]

zip()会让这更加直截了当,但如果您真的不想使用它,至少请查看使用enumerate()并直接迭代来访问您的值:

bacon0 = [[] for _ in range(len(spam[0]))]
for row in spam:
    for i, value in enumerate(row):
        bacon0[i].append(value)