-1

此过程的想法是转换“正方形”(列表列表)并将其翻转。例如,通过输入“正方形”

[[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, 2, 3, 3, 3], [1, 1, 1, 2, 2, 2, 3, 3, 3], [1, 1, 1, 2, 2、2、3、3、3]]

任何想法为什么?请帮忙。

4

3 回答 3

6
zip(*square)

应该工作......这将转置一个二维数组

>>> square = [[1,2,3],[1,2,3],[1,2,3]]
>>> zip(*square)
[(1, 1, 1), (2, 2, 2), (3, 3, 3)]

一个警告是,这会创建一个元组列表......这使得它们不可变......但也更快

于 2012-07-14T19:06:12.323 回答
3

我会用zip自己,但你的代码中的根本问题在这里:

blank = []
[...]
for k in n_index:
    turned.append(blank)

您可能认为这会附加一个新的空列表,因此 turn 包含三个空列表。但是相反,它会将三个引用附加到同一个空列表,因此您对其中一个所做的一切都会发生在其中的“全部”上(“全部”用引号引起来,因为实际上只有一个。)

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

[我没有做任何其他错误测试,所以它仍然可能不正确,但这解释了你看到的奇怪症状。]

于 2012-07-14T19:13:55.667 回答
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]]
于 2012-07-14T19:50:14.397 回答