我正面臨涉及列表的問題。我有一個嵌套 列表等:從列表中獲取(x,y)座標
A = [ [0,2,3,4], [0,1,1,2] ]
其中所述第一列表保持在y和第二列表保持x座標的四個不同點。我想獲得一個列表:
B = [[0,0], [1,2], [1,3], [2,4]]
其中每個列表代表一個點。有沒有簡單的pythonic方法來做到這一點,或者我必須處理循環?如果已經發布了類似的問題,請提前致謝,並感到抱歉。
我正面臨涉及列表的問題。我有一個嵌套 列表等:從列表中獲取(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]]