简体   繁体   中英

Python Split list into sublists based on the first element in the sublists

I want to split a list that looks something like this:

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

into this:

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

The first element/number is variable, so no pattern to split it in even chunks. The chunks size or length should be based on that first element of the chunk. Also the alphabetic letters are just placeholders to make the example more readable, in reality the alphabetic letters are floats and numbers.

So the big list really looks something like this:

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

Simple way, read each chunk length n and include the next n values:

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

Python 2 version:

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

Or without islice :

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

Demo:

>>> 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']]

You can try this one:

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)

Output:

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

Could also trying something simple like this:

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']]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM