功能,列表和方块

时间:2012-07-14 19:04:52

标签: python list

此过程的想法是转换“正方形”(列表列表)并将其转换。 例如,通过输入“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]]

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

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