2016-03-02 242 views
2

我正面临涉及列表的问题。我有一个嵌套 列表等:从列表中获取(x,y)坐标

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

其中所述第一列表保持在y和第二列表保持x坐标的四个不同点。我想获得一个列表:

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

其中每个列表代表一个点。有没有简单的pythonic方法来做到这一点,或者我必须处理循环?如果已经发布了类似的问题,请提前致谢,并感到抱歉。

回答

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

一些事情。首先,这些Python列表大致对应于其他编程语言中的ArrayLists。其次,您在结果中询问了元组元素,但是您发布的代码的元素列表为type

使用内置函数zip

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

numpy的能做到这一点还,在一个或许更可读的方式:

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