2013-08-16 48 views
0

我有一個列表,A = [1.10,1.11,1.12,1.21,1.22,1.48] 和我想的列表A組到嵌套列表B與輸出:分組列表進入的條件下嵌套列表 - Python的

B = [(1.10, 1.11, 1.12), 
    (1.11, 1.12, 1.21), 
    (1.12, 1.21, 1.22), 
    (1.21, 1.22, 1.48)] 

我怎麼能從A產生B?我希望例子足以繼續下去。

回答

3

這裏的另一種方式,可以由具有iterables沒有長度或不能直接索引工作:

from itertools import tee, islice, izip 
A = [1.10,1.11,1.12,1.21,1.22,1.48] 
groups = izip(*[islice(el, n, None) for n, el in enumerate(tee(A, 3))]) 
print list(groups) 
# [(1.1, 1.11, 1.12), (1.11, 1.12, 1.21), (1.12, 1.21, 1.22), (1.21, 1.22, 1.48)] 

警惕,就如何itertools.tee作品中關於緩存值讀了雖然。

5

可能有一個漂亮的解決方案,但這個工程:

>>> A = [1.10,1.11,1.12,1.21,1.22,1.48] 
>>> [A[i:i+3] for i in range(len(A) - 2)] 
[[1.1, 1.11, 1.12], [1.11, 1.12, 1.21], [1.12, 1.21, 1.22], [1.21, 1.22, 1.48]] 
+1

爲什麼'range(len(A) - 2)'而不是'if'? – Bakuriu

+0

@Bakuriu哦,當然,謝謝:) – alecxe

+0

你假設上面的列表已經排序。爲了確保,我會在中間添加另一個'sort'語句。 –

1

試試這個:

[tuple(A[i:i+3]) for i in xrange(len(A)-2)] 

=> [(1.1, 1.11, 1.12), (1.11, 1.12, 1.21), 
    (1.12, 1.21, 1.22), (1.21, 1.22, 1.48)] 
4
zip(A, A[1:], A[2:]) 

這使得它很容易在一個函數來包裝和推廣,以組N,並且還可以很容易地變成迭代器。 (在Python 3.x中,它已經是;在2.x中,只使用itertools.izip代替zip

但是其他的解決方案是不對於任何上述用途,更難;這真是一個投資。

+0

我認爲我們在這裏接近相同的線......將上述變成'zip(* [A [n:] for n in range(3 )])'足夠簡單,並返回內部元組而不是列表,因爲OP顯示爲輸出。 –

+0

@JonClements:'zip' _already_返回內部元組而不是列表。但是,是的,這就是你如何概括爲N. – abarnert

+0

我指的是目前最高的投票答案創建列表的列表,而不是元組列表...... –