2013-11-26 27 views
0

我想使用列表理解來逆轉列表的特定維度。假設我有以下列表:在Python中的2D列表中逆向排序

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

我想回:

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

第一組榜首位置的是相同的順序,但兩者內部集列表的反轉。我成功逆轉了第二層:

>>> [x[::-1] for x in [y for y in test]] 
[[[3, 4], [1, 2]], [[7, 8], [5, 6]]] 

但是當我嘗試:

>>> [z[::-1] for z in [x[::-1] for x in [y for y in test]]] 
[[[1, 2], [3, 4]], [[5, 6], [7, 8]]] 

任何幫助將不勝感激!

+1

你能澄清,你真的想要'[[[4,3],[2,1]],[[6,5],[8,7 ]]]'?我期望'[6,5]'和'[8,7]'被交換,所以'[[[4,3],[2,1]],[[8,7],[6, 5]]]' –

+0

是的,抱歉的錯字!將修復原始 – user2792957

回答

3
>>> test = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]] 
>>> [[y[::-1] for y in x[::-1]] for x in test] 
[[[4, 3], [2, 1]], [[8, 7], [6, 5]]] 

注意,這將是稍微更有效地使用reversed(x),而不是x[::-1],因爲你不會創建不必要的臨時名單,但x[::-1]短的符合你目前的嘗試。

作爲一個方面說明,我找到列表理解顯著更具可讀性,但爲了完整起見,這裏是你如何與map()做到這一點:

>>> map(lambda x: map(list, map(reversed, reversed(x))), test) 
[[[4, 3], [2, 1]], [[8, 7], [6, 5]]] 

或者Python的3.x的(因爲map()回報地圖對象,而不是一個列表):

>>> list(map(lambda x: list(map(list, map(reversed, reversed(x)))), test)) 
[[[4, 3], [2, 1]], [[8, 7], [6, 5]]] 
2

你有兩個單獨的列表解析,和外面一個正在裏面一個的輸出。所以它只是再次顛倒相同的元素。相反,你需要有隻有一個嵌套列表理解:

[y[::-1] for x in test for y in x[::-1]] 

這是我認爲你是瞄準擺在首位。

1

NumPy的選擇:

>>> import numpy as np 
>>> a = np.array(test) 
>>> a[:,::-1,::-1].tolist() 
[[[4, 3], [2, 1]], [[8, 7], [6, 5]]] 
0

列表有內置的功能 「反轉」。這非常方便!

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

for element in test: 
    element.reverse() 
    for entry in element: 
     entry.reverse() 

結果:

>>> test 
[[[4, 3], [2, 1]], [[8, 7], [6, 5]]]