Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将列表成对嵌套的最具python风格(也是最有效的)方法_Python_List_Itertools_List Comprehension - Fatal编程技术网

将列表成对嵌套的最具python风格(也是最有效的)方法

将列表成对嵌套的最具python风格(也是最有效的)方法,python,list,itertools,list-comprehension,Python,List,Itertools,List Comprehension,我的名单是: mylist=[1,2,3,4,5,6] 我想将mylist转换为成对列表: [[1,2],[3,4],[5,6]] 有没有一种类似蟒蛇的方法?列表理解?Itertools?[mylist[2*n:2*n+2]表示X范围内的n(len(mylist)/2)] 该解决方案结合使用列表理解和切片从原始列表中按顺序提取对,并构建切片列表 或者,[mylist[n:n+2]表示xrange中的n(0,len(mylist),2)]除了xrange按两个计数而不是按片计数外,其他都是相同

我的名单是:

mylist=[1,2,3,4,5,6]
我想将mylist转换为成对列表:

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

有没有一种类似蟒蛇的方法?列表理解?Itertools?

[mylist[2*n:2*n+2]表示X范围内的n(len(mylist)/2)]

该解决方案结合使用列表理解和切片从原始列表中按顺序提取对,并构建切片列表

或者,
[mylist[n:n+2]表示xrange中的n(0,len(mylist),2)]
除了
xrange
按两个计数而不是按片计数外,其他都是相同的。感谢史蒂文·伦巴尔斯基的建议

现在来看一个完全不同的例子:这里有一个解决方案(ab),使用
zip
和一个临时函数,而不是中间赋值:

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

Yeppers,列表理解是我通常的做法:

>>> 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
,以节省内存。

另一种方法:

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]))
从以下网站查看“石斑鱼”配方:


我喜欢的技巧是:

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

无论如何,我通常使用生成器而不是列表,所以通常不需要第2行。

比它需要的更复杂——只需按2步执行
xrange
,大部分数学运算就会消失。-1。这将在6项序列上给出5对,这是不正确的。如果您想要itertools配方,它应该是
grouper
。为了增加乐趣,请将zip更改为
zip(*[mylist]*groupsize)
,以允许使用通用的组大小。当然,zip方式在处理长度不能被所需组大小整除的列表时总是会遇到问题。这似乎是“最具Python风格”的方式。@BrianM.Hunt我不知道我会同意这一点。python的zen说“简单比复杂好”,如果你不清楚zip和迭代器是如何工作的,那就很难称之为简单。当然,这是最聪明的方法。@Josiah我有点同意你的看法,不过如果你能把两个不同的发电机压缩在一起,你就会知道它们可以按顺序压缩一个发电机。我发现这种技术相当安全。特别是如果你想在zip(点,点)中使用(x,y),这是显而易见的
>>> mylist = [1, 2, 3, 4, 5, 6]
>>> mylist = iter(mylist)
>>> zip(mylist, mylist)
[(1, 2), (3, 4), (5, 6)]