2013-11-29 28 views
3

反轉二維名單上有一個二維表是這樣的:如何我在python

1 2 3 

    4 5 6 

,我想使這個:

1 4 

    2 5 

    3 6 

我試圖for循環做並切換每個值,但我一直得到一個索引超出限制的錯誤。下面是我有:

for i in results: 
    for j in range(numCenturies): 
     rotated[i][j] = results [j][i] 
+1

這被稱爲「轉置」,而不是「反轉」。顛倒名單意味着將其顛倒過來,而不是將其旋轉90度。 – abarnert

回答

9

從Python文檔上zip功能:

該函數返回一個元組的列表,其中第i元組包含來自每個參數的第i個元素序列或迭代。返回的列表的長度被截斷爲最短參數序列的長度。當有多個長度相同的參數時,zip()類似於map(),初始參數爲None。使用單個序列參數,它將返回1元組列表。沒有參數,它返回一個空列表。

例子:

zip([1, 2, 3], [4, 5, 6]) # returns [(1, 4), (2, 5), (3, 6)] 

如果你需要得到的結果是列表的列表,而不是元組的列表,你可以使用列表理解:

[list(x) for x in zip([1, 2, 3], [4, 5, 6], [7, 8, 9])] # returns [[1, 4, 7], [2, 5, 8], [3, 6, 9]] 

如果所有的變量存儲在一個2d列表中,並且您希望它將其傳遞到zip函數,您可以使用以下內容(我將其稱爲星號,因爲我不記得它的正確英文術語):

results = [[1, 2, 3], [4, 5, 6]] 
zip(*results) # returns [(1, 4), (2, 5), (3, 6)] 
+0

但是如果有兩行以上呢? –

+0

@AswinMurugesh它可以處理任意數量的行:zip([1,2,3],[4,5,6],[7,8,9])返回[(1,4,7),(2 ,5,8),(3,6,9)] – aga

+0

有沒有一種方法,我可以使用這個,如果一切都存儲在一個變量?例如,如果我有一個叫做結果的二維列表,我不確定它有多大,我如何將它傳遞給zip函數? –

2

​​3210

>>> from numpy import transpose 
>>> transpose([[1,2,3],[4,5,6]]) 
array([[1, 4], 
     [2, 5], 
     [3, 6]]) 
1

zip是這樣做的正確的方式,如通過AGA。

但是,如果你想知道爲什麼你的原代碼不工作:

for i in results: 
    for j in range(numCenturies): 
     rotated[i][j] = results [j][i] 

這裏有兩個明顯的問題,可能兩個人。 (因爲你沒有表現出我們足夠的代碼或數據可以肯定,我不能保證這兩個可能的。)

想必results看起來是這樣的:

results = [[1, 2, 3], [4, 5, 6]] 

當你做for i in results時,這意味着i將成爲結果中的每個元素,即它將是[1, 2, 3],然後[4, 5, 6]。你不能使用列表作爲列表中的索引,所以這是保證給你一個TypeError: list indices must be integers, not list

要解決這個問題,你需要:

for i in range(len(results)): 

...或...

for i, row in enumerate(results): 

接下來,results[j][i]是保證提高IndexError: list index out of range,因爲i是每個號碼,但你正在嘗試使用它作爲號碼。如果你迭代的results的行和列,你想這樣:

rotated[j][i] = results[i][j] 

接下來,除非你預填rotated有3名單,其中的每一個被預填充具有2個對象某種,你會得到一個IndexError: list assignment index out of range

要解決這個問題,就需要預先填充rotated,這樣的事情:

rotated = [[None for j in range(2)] for i in range(3)] 

......或者......

rotated = [[None, None], [None, None], [None, None]] 

最後,我敢打賭numCenturies是3,在這種情況下,只要j達到2,您將獲得另一個IndexError: list index out of range。這裏最簡單的事情就是使用行的長度;這樣就不會有錯誤的機會。

全部放在一起:

rotated = [[None for j in range(2)] for i in range(3)] 
for i, row in enumerate(results): 
    for j, value in enumerate(row): 
     rotated[j][i] = value 

但在一般情況下,Python中爲您提供了更簡單的方式來做事不是預先創建數組和遍歷指數填寫值。您可以使用append - 或更好的列表理解。或者,更好的辦法是找到更高層次的方式來編寫您的使用方法,例如撥打zip