基于子列表中的第一个元素,将Python列表拆分为子列表

4

我想要拆分一个类似于以下列表的内容:

list = [5, a, b, c, d, e, 2, a, b, 4, a ,b ,c ,d , ...]

将其转换为:

list  = [ [5, a, b, c, d, e], [2, a, b] , [4, a ,b ,c ,d] ...]

第一个元素/数字是变量,因此没有模式可以将其分成均匀的块。

块的大小或长度应基于该块的第一个元素。

另外,字母只是占位符,以使示例更易读。实际上,字母是浮点数和数字。

因此,大列表实际上看起来像这样:

list = [5, 7, 3.2, 3.1, 4.6, 3, 2, 5.1, 7.1, 4, 5.12 ,3.4 ,4.8 ,12.1 , ...]

2
由于您没有尝试,这里为您提供一个使用Pandas的解决方案。x = pd.Series(lst); result = x.groupby(x.astype(str).str.isdigit().cumsum()).apply(list).tolist()祝你好运! - cs95
1
我不同意复制目标。那里的答案不直接适用于这里。 - vaultah
3个回答

19

简单的方法,读取每个数据块的长度n,并包含接下来的n个值:

it = iter(l)
[[n, *islice(it, n)] for n in it]

Python 2 版本:

it = iter(l)
[[n] + list(islice(it, n)) for n in it]

或者不使用 islice

it = iter(l)
[[n] + [next(it) for _ in range(n)] for n in it]

演示:

>>> from itertools import islice
>>> l = [5, 'a', 'b', 'c', 'd', 'e', 2, 'f', 'g', 4, 'h' ,'i' ,'j' ,'k']
>>> it = iter(l)
>>> [[n, *islice(it, n)] for n in it]
[[5, 'a', 'b', 'c', 'd', 'e'], [2, 'f', 'g'], [4, 'h', 'i', 'j', 'k']]

2
你可以尝试这个:
l = [5, 'a', 'b', 'c', 'd', 'e', 2, 'a', 'b', 4, 'a' ,'b' ,'c' ,'d']

pos = [(index, i) for index, i in enumerate(l) if type(i)==int]
l = [l[p[0]:p[0]+p[1]+1] for p in pos]
print(l)

输出:

[[5, 'a', 'b', 'c', 'd', 'e'], [2, 'a', 'b'], [4, 'a', 'b', 'c', 'd']]

1
最后一个列表不包含最后一项。但是,请不要喂食巨魔... - Willem Van Onsem
如果“占位符”中有整数,就无法正常工作。就像在他们的显式示例中一样。 - Stefan Pochmann

1
可以尝试像这样简单的东西:
l = [5, 'a', 'b', 'c', 'd', 'e', 2, 'f', 'g', 4, 'h' ,'i' ,'j' ,'k']

numbers = [i for i, e in enumerate(l) if isinstance(e, int)]

result = [l[s:e] for s, e in zip(numbers[:-1], numbers[1:])] + [l[numbers[-1]:]]

print(result)
# [[5, 'a', 'b', 'c', 'd', 'e'], [2, 'f', 'g'], [4, 'h', 'i', 'j', 'k']]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接