从列表列表中获取(x,y)坐标

时间:2016-03-02 19:01:10

标签: python list

我正面临涉及列表的问题。我有一个嵌套的 列表如:

A = [ [0,2,3,4], [0,1,1,2] ]

其中第一个列表包含y,第二个列表包含四个不同点的x坐标。我想获得一份清单:

B = [[0,0], [1,2], [1,3], [2,4]]

其中每个列表代表一个点。是否有一种简单的pythonic方法可以做到这一点,还是我必须处理for循环?如果已发布类似问题,请提前感谢,抱歉。

3 个答案:

答案 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)

numpy也可以用更可读的方式做到:

In [88]: y,x=A;numpy.transpose([x,y]).tolist()
Out[88]: [[0, 0], [1, 2], [1, 3], [2, 4]]