大多数pythonic(和有效)的方式将列表成对嵌套

时间:2012-08-03 02:47:55

标签: python list itertools list-comprehension

我的清单是:

mylist=[1,2,3,4,5,6]

我想将mylist转换为对列表:

[[1,2],[3,4],[5,6]]

有这样做的pythonic方法吗?列表理解? Itertools?

5 个答案:

答案 0 :(得分:9)

Yeppers,list comprehension是我通常的做法:

>>> groupsize = 2
>>> [mylist[x:x+groupsize] for x in range(0,len(mylist),groupsize)]
[[1,2],[3,4],[5,6]]
>>> groupsize = 3
>>> [mylist[x:x+groupsize] for x in range(0,len(mylist),groupsize)]
[[1,2,3],[4,5,6]]

我使用range来实现可移植性,如果您使用的是python 2(可能是),请将range更改为xrange以节省内存。

答案 1 :(得分:8)

我的首选技巧:

>>> mylist = [1, 2, 3, 4, 5, 6]
>>> mylist = iter(mylist)
>>> zip(mylist, mylist)
[(1, 2), (3, 4), (5, 6)]

我通常使用生成器代替列表,因此通常不需要第2行。

答案 2 :(得分:6)

另一种方式:

zip( mylist[:-1:2], mylist[1::2] )

生成元组列表:

>>> zip(mylist[:-1:2],mylist[1::2])
[(1, 2), (3, 4), (5, 6)]

如果你真的想要一份清单:

map(list, zip(mylist[:-1:2],mylist[1::2]))

答案 3 :(得分:5)

查看itertools documentation

中的“石斑鱼”食谱
def grouper(n, iterable, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

答案 4 :(得分:2)

[mylist[2*n:2*n+2] for n in xrange(len(mylist)/2)]

此解决方案结合使用列表推导和切片从原始列表中依次提取对,并构建切片列表。

或者,[mylist[n:n+2] for n in xrange(0, len(mylist), 2)]除了xrange之外是相同的,而不是切片。感谢Steven Rumbalski提出的建议。

现在有一些完全不同的东西:这里有一个使用zip的解决方案(ab)和一个短暂的函数而不是中间分配:

>>> (lambda i: zip(i, i))(iter(mylist))
[(1, 2), (3, 4), (5, 6)]