将列表拆分为不均匀的组?

J. *_* P. 13 python split list sublist python-2.7

我知道如何将列表拆分成偶数组,但我无法将其拆分为不均匀的组.

基本上这就是我所拥有的:一些列表,我们称之为mylist包含x元素的列表.

我还有另一个文件,我们称之为second_list,看起来像这样:

{2, 4, 5, 9, etc.}
Run Code Online (Sandbox Code Playgroud)

现在我想做的是mylist通过second_list中的间距划分为不均匀的组.所以,我希望我的第一组成为前两个元素mylist,第二组成为接下来的4个元素mylist,第三组成为接下来的5个元素mylist,第四组成为下一个9元素的"mylist",等等.

有一些简单的方法来做到这一点?如果你想将它分成偶数组,我尝试做类似的事情:

for j in range(0, len(second_list)):
    for i in range(0, len(mylist), second_list[j]):
        chunk_mylist = mylist[i:i+second_list[j]]
Run Code Online (Sandbox Code Playgroud)

然而,这不会像我想要的那样分裂它.我想用我的#子列表是的,结束了len(second_list),也正常分裂,这给比这更大量的(也是分裂不正确地).

Pad*_*ham 19

您可以创建迭代器和itertools.islice:

mylist = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
seclist = [2,4,6]

from itertools import islice
it = iter(mylist)

sliced =[list(islice(it, 0, i)) for i in seclist]
Run Code Online (Sandbox Code Playgroud)

哪个会给你:

[[1, 2], [3, 4, 5, 6], [7, 8, 9, 10, 11, 12]]
Run Code Online (Sandbox Code Playgroud)

一旦消耗了元素,它们就会消失,所以我们不断获得下一个i元素.

不确定剩余元素会发生什么,如果你想添加它们,你可以添加如下内容:

mylist = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 ,14]
seclist = [2, 4, 6]

from itertools import islice

it = iter(mylist)

slices = [sli for sli in (list(islice(it, 0, i)) for i in seclist)]
remaining = list(it)
if remaining:
    slices.append(remaining)
print(slices)
Run Code Online (Sandbox Code Playgroud)

哪个会给你:

 [[1, 2], [3, 4, 5, 6], [7, 8, 9, 10, 11, 12], [13, 14]]
Run Code Online (Sandbox Code Playgroud)

或者相反,如果没有足够的,你可以使用几种方法来删除空列表,一个是内部生成器表达式:

from itertools import islice

it = iter(mylist)
slices = [sli for sli in (list(islice(it, 0, i)) for i in seclist) if sli]
Run Code Online (Sandbox Code Playgroud)

或者与itertools.takewhile结合使用:

 from itertools import islice, takewhile

it = iter(mylist)
slices = list(takewhile(bool, (list(islice(it, 0, i)) for i in seclist)))
Run Code Online (Sandbox Code Playgroud)

适用于:

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

会给你:

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

相反:

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

您的使用完全取决于您可能的影响以及您希望如何处理各种可能性.

  • 很好地使用`islice` - 从*相同的*迭代器中消耗不同数量的项目.+1 (2认同)

Kas*_*mvd 7

numpythonic方法:

>>> lst = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
>>> sec = [2, 4, 5]
>>> np.split(lst, np.cumsum(sec))
[array([0, 1]), array([2, 3, 4, 5]), array([ 6,  7,  8,  9, 10]), array([11])]
Run Code Online (Sandbox Code Playgroud)

这是一个Python3.X方法使用itertool.accumulate():

>>> lst = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
>>> sec = [2,4,6]
>>> from itertools import accumulate
>>> sec = list(accumulate(sec_lst))
>>> sec = [0] + sec + [None] if sec[0] != 0 else sec + [None]
>>> 
>>> [lst[i:j] for i, j in zip(sec, sec[1:])]
[[0, 1], [2, 3, 4, 5], [6, 7, 8, 9, 10], [11]]
Run Code Online (Sandbox Code Playgroud)


Oha*_*tan 5

将列表推导与切片和sum()函数(python 的所有基本和内置工具)一起使用:

mylist = [1,2,3,4,5,6,7,8,9,10]
seclist = [2,4,6]

[mylist[sum(seclist[:i]):sum(seclist[:i+1])] for i in range(len(seclist))]

#output:
[[1, 2], [3, 4, 5, 6], [7, 8, 9, 10]]
Run Code Online (Sandbox Code Playgroud)

如果seclist很长并且您希望首先更有效地使用numpy.cumsum()

import numpy as np
cumlist = np.hstack((0, np.cumsum(seclist)))
[mylist[cumlist[i]:cumlist[i+1]] for i in range(len(cumlist)-1)]
Run Code Online (Sandbox Code Playgroud)

并得到相同的结果


nbr*_*ans 1

该解决方案会跟踪您编写的项目数量。如果 中的数字总和second_list长于,它将崩溃mylist

total = 0
listChunks = []
for j in range(len(second_list)):
    chunk_mylist = mylist[total:total+second_list[j]]
    listChunks.append(chunk_mylist)
    total += second_list[j]
Run Code Online (Sandbox Code Playgroud)

运行后,listChunks会得到一个包含子列表的列表,其长度在 中找到second_list