2016-03-02 243 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]]