从列表中获取(x,y)坐标
问题描述:
我正面临涉及列表的问题。我有一个嵌套 列表等:从列表中获取(x,y)坐标
A = [ [0,2,3,4], [0,1,1,2] ]
其中所述第一列表保持在y和第二列表保持x坐标的四个不同点。我想获得一个列表:
B = [[0,0], [1,2], [1,3], [2,4]]
其中每个列表代表一个点。有没有简单的pythonic方法来做到这一点,或者我必须处理循环?如果已经发布了类似的问题,请提前致谢,并感到抱歉。
答
这就是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]
给你一个完整的列表,我们并不真正需要。
答
numpy的能做到这一点还,在一个或许更可读的方式:
In [88]: y,x=A;numpy.transpose([x,y]).tolist()
Out[88]: [[0, 0], [1, 2], [1, 3], [2, 4]]