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

jba*_*tos 5 python list-comprehension list python-itertools

我的清单是:

mylist=[1,2,3,4,5,6]
Run Code Online (Sandbox Code Playgroud)

我想将mylist转换为对列表:

[[1,2],[3,4],[5,6]]
Run Code Online (Sandbox Code Playgroud)

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

Jos*_*iah 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]]
Run Code Online (Sandbox Code Playgroud)

我使用range可移植性,如果你使用python 2(你可能是)更改rangexrange以节省内存.


rob*_*ing 8

我的首选技术:

>>> mylist = [1, 2, 3, 4, 5, 6]
>>> mylist = iter(mylist)
>>> zip(mylist, mylist)
[(1, 2), (3, 4), (5, 6)]
Run Code Online (Sandbox Code Playgroud)

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

  • 为了增加乐趣,请将zip更改为`zip(*[mylist]*groupsize)`以允许通用组大小.当然,zip方式总是会遇到处理列表的问题,这些列表的长度不能被所需的组大小整除. (2认同)

sfs*_*man 6

另一种方式:

zip( mylist[:-1:2], mylist[1::2] )
Run Code Online (Sandbox Code Playgroud)

这会产生一个元组列表:

>>> zip(mylist[:-1:2],mylist[1::2])
[(1, 2), (3, 4), (5, 6)]
Run Code Online (Sandbox Code Playgroud)

如果你真的想要一个列表列表:

map(list, zip(mylist[:-1:2],mylist[1::2]))
Run Code Online (Sandbox Code Playgroud)


Eva*_*rim 5

查看itertools文档中的"grouper"配方:

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)
Run Code Online (Sandbox Code Playgroud)


wbe*_*rry 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感谢史蒂文·伦巴尔斯基的建议。

现在是完全不同的事情:这是一个解决方案(ab),使用zip临时函数而不是中间赋值:

>>> (lambda i: zip(i, i))(iter(mylist))
[(1, 2), (3, 4), (5, 6)]
Run Code Online (Sandbox Code Playgroud)

  • 比实际需要的更复杂——只需将“xrange”步长 2,大部分数学运算就消失了。 (5认同)