此过程的想法是转换“正方形”(列表列表)并将其转换。 例如,通过输入“square”
[[1,2,3],[1,2,3],[1,2,3]]
程序应该返回
[[1,1,1],[2,2,2],[3,3,3]]
def turn_square(list4)
n_index = [0,1,2]
turned = []
blank = []
turned_i = 0
for k in n_index:
turned.append(blank)
for i in n_index:
for j in n_index:
turned[turned_i].append(list4[j][i])
turned_i = turned_i + 1
但是,我不知道为什么,它正在回归
[[1,1,1,2,2,3,3,3],[1,1,1,2,2,3,3,3],[1,1,1] ,2,2,2,3,3,3]]
任何想法为什么?请帮忙。
答案 0 :(得分:6)
zip(*square)
应该工作...将转置一个二维数组
>>> square = [[1,2,3],[1,2,3],[1,2,3]]
>>> zip(*square)
[(1, 1, 1), (2, 2, 2), (3, 3, 3)]
一个警告是,这会创建一个元组列表......这使得它们不可变......但也更快
答案 1 :(得分:3)
我自己会使用zip
,但代码中的基本问题是:
blank = []
[...]
for k in n_index:
turned.append(blank)
您可能认为这会附加一个新的空列表,因此转为包含三个空列表。但相反,它会向相同的空列表附加三个引用,因此您对其中的所有内容都会发生在“all”中(引号中的“all”,因为实际上只有一个。)
>>> blank = []
>>> a = [blank, blank]
>>> a
[[], []]
>>> a[0].append("fred")
>>> a
[['fred'], ['fred']]
他们在记忆中是同一个对象:
>>> a[0] is a[1]
True
如果我们更改您的代码以便创建新列表[并添加return turned
],即
turned.append([])
然后它起作用:
>>> x = [[1,2,3], [1,2,3], [1,2,3]]
>>> x
[[1, 2, 3], [1, 2, 3], [1, 2, 3]]
>>> x = turn_square(x)
>>> x
[[1, 1, 1], [2, 2, 2], [3, 3, 3]]
>>> x = turn_square(x)
>>> x
[[1, 2, 3], [1, 2, 3], [1, 2, 3]]
[我没有做任何其他错误测试,所以它仍然可能不正确,但这解释了你看到的奇怪症状。]
答案 2 :(得分:0)
这似乎是数字数据,根据您的目标,numpy数组数据类型(和转置操作)可能就是您想要的。这将提高性能,这对于大型数据集非常重要。
但是如果你绝对必须将它作为python列表(例如,如果列表包含文本和数字数据的混合)并且上面的元组解决方案不能满足您的需求(例如,如果您需要进一步稍后编辑结果的操作),你可以尝试嵌套列表理解。
>>> data = [[1,2,3],[1,2,3],[1,2,3]]
>>> [ [ j[i] for j in data ] for i in range( len(j) ) ]
[[1, 1, 1], [2, 2, 2], [3, 3, 3]]