我想使用列表理解来反转列表的特定维度。假设我有以下列表:
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]]]
非常感谢任何帮助!
答案 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]]]