Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.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 - Fatal编程技术网

将嵌套列表操作为嵌套块列表的python方法

将嵌套列表操作为嵌套块列表的python方法,python,list,Python,List,我有一个列表,其嵌套列表的大小可能会随着2的倍数而变化。目前,在本例中,嵌套列表的长度为4 a_list = [[1,2,3,4],[5,6,7,8],[9,10,11,12]] 根据长度,我试图打破列表,以尽可能最好的方式获得以下结果: a = [[1,2], [5,6], [9,10]] b = [[3,4], [7,8], [11,12]] 若嵌套列表的长度为6,则 c = [[..], [..], [..]] 它是一种嵌套列表的转置,但在一行中有两组值不可转置。使用列表理解: &g

我有一个列表,其嵌套列表的大小可能会随着2的倍数而变化。目前,在本例中,嵌套列表的长度为4

a_list = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
根据长度,我试图打破列表,以尽可能最好的方式获得以下结果:

a = [[1,2], [5,6], [9,10]]
b = [[3,4], [7,8], [11,12]]
若嵌套列表的长度为6,则

c = [[..], [..], [..]]

它是一种嵌套列表的转置,但在一行中有两组值不可转置。

使用列表理解:

>>> a_list = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
>>> a = [x[:2] for x in a_list]
>>> b = [x[2:] for x in a_list]
>>> a
[[1, 2], [5, 6], [9, 10]]
>>> b
[[3, 4], [7, 8], [11, 12]]
更一般的解决方案:

>>> [[x[i:i+2] for x in a_list] for i in range(0, len(a_list[0]), 2)]
[[[1, 2], [5, 6], [9, 10]],
 [[3, 4], [7, 8], [11, 12]]]

与falsetru的答案几乎相同,但首先将嵌套列表拆分为大小为2的块,然后将它们全部压缩在一起

>>> a_list = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
>>> zip(*([j[i*2: i*2 + 2] for i in range(len(j) / 2)] for j in a_list))
[([1, 2], [5, 6], [9, 10]), ([3, 4], [7, 8], [11, 12])]

>>> a_list = [[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12]]
>>> zip(*([j[i*2: i*2 + 2] for i in range(len(j) / 2)] for j in a_list))
[([1, 2], [7, 8]), ([3, 4], [9, 10]), ([5, 6], [11, 12])]

>>> a_list = [[1,2,3,4,100,102],[5,6,7,8,103,104],[9,10,11,12,105,106]]
>>> zip(*([j[i*2: i*2 + 2] for i in range(len(j) / 2)] for j in a_list))
[([1, 2], [5, 6], [9, 10]), ([3, 4], [7, 8], [11, 12]), ([100, 102], [103, 104], [105, 106])]
我不太愿意称之为“pythonic”,因为它几乎难以辨认,但是:

>>> a, b = zip(*(zip(*[iter(s)]*2) for s in a_list))
>>> a
((1, 2), (5, 6), (9, 10))
>>> b
((3, 4), (7, 8), (11, 12))
也适用于6项列表:

>>> a_list = [[1,2,3,4,100,102],[5,6,7,8,103,104],[9,10,11,12,105,106]]
>>> a, b, c = zip(*(zip(*[iter(s)]*2) for s in a_list))
>>> a
((1, 2), (5, 6), (9, 10))
>>> b
((3, 4), (7, 8), (11, 12))
>>> c
((100, 102), (103, 104), (105, 106))
快速方法是使用:


由于可读性是pythonic的,因此这里有一个更简单的基于迭代器的解决方案(没有@Zero用来将其转换为一行程序的巧妙技巧):

首先,一个迭代器,它将列表
[1,2,3,4,5,6]
转换为
[(1,2)、(3,4)、(5,6)]

列表
a_列表
可以转换为这样一对列表的列表,如下所示:

a_list = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]    
pair_list = [ pairs(row) for row in a_list ]
最后,我们需要有效地转换这个列表,从每个子列表中列出第一对/元素,再列出第二个元素,等等。一个很好的习惯用法是
zip(*some_list)
。让我们使用它进行OP请求的转换:

a, b = zip(*pair_list)
或在一个列表中收集任意数量的生成列表:

results = list( zip(*pair_list) )
请随意将这些包装成一行(尽管我不会):


@第四,我添加了另一个更通用的代码。我认为最好不要在第二个示例中使用元组解包,因为它可以处理任何长度的子列表。只需将结果存储在新的嵌套列表中。@RogerFan,我相应地更新了答案。谢谢你的建议。@Falstru很好,我的方法也很相似。但是你的看起来很简单。第二个例子中的三个列表中会包含哪些值?@alexis就像如果a_list=[[1,2,3,4100102],[5,6,7,8103104],[9,10,11,12105106]],那么c=[[100102],[103104],[105106]]+1代表
zip(*[iter(s)]*2
,我从未见过这个成语:-)我会把你的答案称为pythonic:迭代器解决方案是pythonic,而且它的组件比切片解决方案少——只要你说迭代器就行了。对于通用解决方案,只需将
zip
的结果转换成一个列表(在python 2中它已经是一个列表)并保存在一个变量中。
a, b = zip(*pair_list)
results = list( zip(*pair_list) )
results = list(zip( *(pairs(row) for row in a_list) ))