在Python中的2D列表中反转顺序

时间:2013-11-26 18:53:20

标签: python list reverse

我想使用列表理解来反转列表的特定维度。假设我有以下列表:

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

非常感谢任何帮助!

4 个答案:

答案 0 :(得分: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]]]

答案 1 :(得分:2)

您有两个单独的列表推导,而外部的列表推理正在处理内部列表推理的输出。所以它只是反过来重复相同的元素。相反,您只需要一个嵌套列表理解:

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

我认为这首先是你的目标。

答案 2 :(得分:1)

NumPy替代方案:

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

答案 3 :(得分: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]]]