我知道如何将列表拆分为偶数组,但我无法将其拆分为不均匀的组。
基本上这就是我所拥有的:一些列表,让我们称之为mylist
,包含x个元素。
我还有另一个文件,我们称之为second_list,看起来像这样:
{2, 4, 5, 9, etc.}
现在我要做的是通过second_list中的间距将mylist
划分为不均匀的组。所以,我希望我的第一组成为mylist
的前两个元素,第二组成为mylist
的下四个元素,第三组成为{{1}的下一个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]]
,并且也正确分割,这会提供更多(并且也会错误地拆分)。
答案 0 :(得分:15)
您可以创建一个迭代器和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]
哪会给你:
[[1, 2], [3, 4, 5, 6], [7, 8, 9, 10, 11, 12]]
一旦消耗了 i 元素,它们便消失了,所以我们不断获取下一个 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)
哪会给你:
[[1, 2], [3, 4, 5, 6], [7, 8, 9, 10, 11, 12], [13, 14]]
或者相反,如果没有足够的,你可以使用几种方法来删除空列表,一个是内部生成器表达式:
from itertools import islice
it = iter(mylist)
slices = [sli for sli in (list(islice(it, 0, i)) for i in seclist) if sli]
或与itertools.takewhile结合使用:
from itertools import islice, takewhile
it = iter(mylist)
slices = list(takewhile(bool, (list(islice(it, 0, i)) for i in seclist)))
适用于:
mylist = [1, 2, 3, 4, 5, 6]
seclist = [2, 4, 6,8]
会给你:
[[1, 2], [3, 4, 5, 6]]
相反:
[[1, 2], [3, 4, 5, 6], [], []]
您的使用完全取决于您可能的影响以及您希望如何处理各种可能性。
答案 1 :(得分:6)
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])]
这是使用itertool.accumulate()
的Python3.X方法:
>>> 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]]
答案 2 :(得分:4)
将list-comprehensions与切片和http://php.net/manual/en/function.empty.php函数(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]]
如果seclist
非常长并希望提高效率,请先使用sum()
:
import numpy as np
cumlist = np.hstack((0, np.cumsum(seclist)))
[mylist[cumlist[i]:cumlist[i+1]] for i in range(len(cumlist)-1)]
并获得相同的结果
答案 3 :(得分: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]
运行此操作后,listChunks
是一个包含second_list
中找到长度的子列表的列表。
答案 4 :(得分:1)
subgroups = []
start=0
for i in second_list:
subgroups.append(mylist[start:start + i])
start = i + start
最后subgroups
将包含所需的列表
示例运行:
>>> mylist = [1,2,3,4,5,6,7,8,9,10,11,12]
>>> second_list = [2,4,5,9]
>>> subgroups = []
>>> start=0
>>> for i in second_list:
... subgroups.append(mylist[start:start + i])
... start = i + start
...
>>> subgroups
[[1, 2], [3, 4, 5, 6], [7, 8, 9, 10, 11], [12]]
答案 5 :(得分:0)
Padriac拥有最好的IMO解决方案,但我会用这种笨拙的不需要进口的班轮来报废:
>>> L = [1,2,3,4,5,6,7,8,9,10] # source list - could be any iterable
>>> S = [2,3,4] # group sizes - could be any iterable
>>> [ [ [ next(i) for k in range(j) ] for j in iter(S) ] for i in [iter(L)] ][0]
[[1, 2], [3, 4, 5], [6, 7, 8, 9]]