2013-08-16 34 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

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