2012-06-15 57 views
1

我想创建一个2d数组或列表或Python中的其他东西。我对这门语言很陌生,所以我不知道所有的来龙去脉,不同的类型或图书馆。在Python中创建2d网格

基本上,我有名单,克方名单,我想转就(把行转换成列和列到行)。稍后我将遍历这个列表和列表的转置列表。在转置列表中,列的顺序无关紧要。这是“Python方式”吗?有没有更快的方法来做到这一点?

我喜欢使用列表,因为我舒服是如此的相似在我所知道的语言数组语法,但如果在Python更好的办法,我想了解它。

 
def makeLRGrid(g): 
    n = [] 
    for i in range(len(g)): 
     temp = [] 
     for j in range(len(g)): 
      temp.append(g[j][i]) 
     n.append(temp) 
    return n 

Thank you for any help you can offer!

Edit: Sorry for the confusion, apparently I mean transpose, not invert!

回答

3

This implementation does the same as yours for "square" lists of lists:

def makeLRGrid(g): 
    return [row[:] for row in g] 

A list can be copied by slicing the whole list with [:],并且您可以使用列表理解为每一行执行此操作。

编辑:你似乎实际上瞄准了transposing列表的列表。这可以用zip()做到:

def transpose(g): 
    return zip(*g) 

,或者,如果你真的需要列出

def transpose(g): 
    return map(list, zip(*g)) 

又见documentation of zip()的列表。

+0

对不起,我的意思是通过将列转换为列来反转列表,反之亦然。我相信这段代码只是复制列表的列表?是否有像这样的光滑语法将行转换为列和列成行? – William

+0

这真的很好,谢谢!我还有一个问题是*运营商做什么?它是否简单地把每个列表作为zip的单独参数?这个文档对我来说不是很清楚这个问题。 – William

+0

@ user1458948:它的确如你所说。有关更多信息,请参阅Python教程,关于函数和参数的一些部分。顺便说一下,它被称为“参数拆包”。 –

3

用于数字编程我会强烈建议NumPy(以及相关的SciPy)。 NumPy实现非常快速multi-dimensional arrays。看看here可用的数组操作例程。

+1

谢谢你的建议,但我只是在做一个小项目,所以我不认为NumPy是我需要的。不过,我会看看它,如果不太复杂,可以使用它。 – William

+1

尽可能多的我喜欢numpy,你应该尝试不依赖于链接给出一个问题的答案。 @ user1458948即使你的项目很小,如果你的网格很大,numpy也会有用。 – Simon

+0

@Simon我通常会尝试 - 我同意只是链接的答案不是特别有用。在这种情况下,我认为我通过暗示NumPy来补充其他答案。另外,在给出一个可靠的例子之前,我正在等待发现*反转列表*的意思。 – Chris

1

我猜invert the list of lists是这样的:

g = [[1,2,3], [4,5,6], [7,8,9]] 
result = [p[::-1] for p in g] 
print result 

输出:

[[3,2,1], [6,5,4], [9,8,7]] 

也许我的担心。你能举一些例子吗?

编辑:的评论例如

result = [list(p) for p in zip(*g)] 
print result 

输出:

[[1,4,7], [2,5,8], [3,6,9]] 
+0

g = [[1,2,3],[4,5,6],[7,8,9]] 结果= [[1,4,7],[2,5,8],[3 ,6,9]] – William

2

要添加到克里斯的评论,我真的不能推荐numpy的不够。你说这是为了一个项目,但为了学习一些简单的语法,你可能会多次使用它。

例如,如果你有一个清单克名单:通过简单地

>>> import numpy as np 
>>> g_array = np.array(g) 
>>> g_array 
array([[1, 2, 3], 
     [4, 5, 6], 
     [7, 8, 9]]) 

访问任何项目:

g = [[1,2,3],[4,5,6],[7,8,9]] 

可以使这个到一个数组只需

>>> g_array[0,1] 
2 
>>> g_array[1,2] 
6 

并执行你的'反转'(实际上是转置 - 即第一行成为第一列,直到每行):

>>> g_transpose = g_array.transpose() # or = g_array.T from Simon's comment 
>>> g_transpose 
array([[1, 4, 7], 
     [2, 5, 8], 
     [3, 6, 9]]) 
+1

或'g_array.T'。 +1为numpy答案 – Simon