我正面临涉及列表的问题。我有一个嵌套的 列表如:
A = [ [0,2,3,4], [0,1,1,2] ]
其中第一个列表包含y,第二个列表包含四个不同点的x坐标。我想获得一份清单:
B = [[0,0], [1,2], [1,3], [2,4]]
其中每个列表代表一个点。是否有一种简单的pythonic方法可以做到这一点,还是我必须处理for循环?如果已发布类似问题,请提前感谢,抱歉。
答案 0 :(得分:4)
这就是zip
功能的用途。
>>> A = [ [0,2,3,4], [0,1,1,2] ]
>>> B = [list(x) for x in zip(*A[::-1])]
>>> B
[[0, 0], [1, 2], [1, 3], [2, 4]]
如果你不需要你的元素作为列表(即元组也很好),这会缩短为
>>> zip(*A[::-1])
[(0, 0), (1, 2), (1, 3), (2, 4)]
在Python 2和
中>>> list(zip(*A[::-1]))
[(0, 0), (1, 2), (1, 3), (2, 4)]
在Python 3中。
语法说明:
A[::-1]
正在撤销A
:
>>> A[::-1]
[[0, 1, 1, 2], [0, 2, 3, 4]]
然后,反向列表以解压缩的形式(注意*
)传递给zip
函数,这相当于
>>> zip([0, 1, 1, 2], [0, 2, 3, 4])
[(0, 0), (1, 2), (1, 3), (2, 4)]
和zip
将从每个可迭代的第一个,第二个,......,第n个元素构建元组。
编辑:
小改进:
>>> zip(*reversed(A))
[(0, 0), (1, 2), (1, 3), (2, 4)]
应该提高内存效率,因为reversed
为你提供了一个迭代器,A[::-1]
为你提供了一个我们并不需要的完整列表。
答案 1 :(得分:1)
一些事情。首先,这些是Python列表,大致对应于其他编程语言中的ArrayLists。其次,您在结果中询问了元组元素,但您发布的代码包含type列表元素。
使用zip内置功能。</ p>
B = list(zip(*A[::-1]))
print(B)
产量
[(0, 0), (2, 1), (3, 1), (4, 2)]
如果您想要类型列表的元素,您可以执行以下操作。
B = list(map(list, zip(*A[::-1])))
print(B)
产量
[[0, 0], [2, 1], [3, 1], [4, 2]]
答案 2 :(得分:1)
In [88]: y,x=A;numpy.transpose([x,y]).tolist()
Out[88]: [[0, 0], [1, 2], [1, 3], [2, 4]]