2017-03-08 22 views
-1

我有值列表的郵編項目從列表中蟒

[43.4543, 23.45343, 76.55665, 33.4345, 5] 

我需要壓縮它通過以下方式,

[(43.4543,23.45343,5),(76.55665,33.4345,5)] 

任何人都可以引導我解決這個?

+0

@ PM2Ring是完全相同。有一個錯字 –

+3

你能否澄清你正在嘗試完成的* general *任務是什麼?基於切片,你似乎試圖分裂均勻和奇怪索引的元素,但與輸出示例不匹配。爲什麼最後一個元素會在輸出的兩半中結束? – jonrsharpe

+1

問題不清楚。請編輯您的問題與預期的輸出 –

回答

2

zip將返回一個長度等於最短輸入序列長度的列表。由於最後一個(A[-1:])只有1個元素,所以不能使用zip。嘗試一下不同的東西。

a = [43.4543, 23.45343, 76.55665, 33.4345, 5] 
map(lambda x: x + (a[-1],), zip(a[::2], a[1::2])) 
+2

或者,作爲一個列表理解:在zip(a [: - 1:2],a [1:-1:2])]' –

0

P = zip(A[::2], A[1::2], A[-1:]*2)應該得到所需要的輸出

2

您可以使用zipitertools.repeat

>>> from itertools import repeat 
>>> l = [43.4543, 23.45343, 76.55665, 33.4345, 5] 
>>> it = iter(l) 
>>> list(zip(it, it, repeat(l[-1]))) 
[(43.4543, 23.45343, 5), (76.55665, 33.4345, 5)] 
+0

''repeat'中的x [(a [-1]是比「循環」更明智的選擇。爲什麼我沒有想到這個? :) –

1

我不知道你爲什麼要在這裏使用zip。對於給定的數據你可以組裝所需的輸出是這樣的:

p = [a[:2] + a[-1:], a[2:]] 

如果列表中的項目必須是元組:

p = [tuple(u) for u in (a[:2] + a[-1:], a[2:])] 

但是你可以用zipitertools.cycle

from itertools import cycle 

a = [43.4543, 23.45343, 76.55665, 33.4345, 5] 
p = zip(a[::2], a[1::2], cycle(a[-1:])) 
print(list(p)) 

輸出

[(43.4543, 23.45343, 5), (76.55665, 33.4345, 5)] 

這將適用於奇數長度的任何a

而不是使用itertools.cycle,您可以使用itertools.repeat,如在niemmi的答案。


另一種選擇是與源列表的迭代器ZIP:

from itertools import repeat 

a = range(11) 
head, tail = iter(a), a[-1] 

p = zip(head, head, repeat(tail)) 
print(list(p)) 

輸出

[(0, 1, 10), (2, 3, 10), (4, 5, 10), (6, 7, 10), (8, 9, 10)]