JuanPablo
JuanPablo

Reputation: 24754

split list in sub lists by number of elements

In python, if I have the list of elements

l = ['a', 'b', 'c', 'd', 'e', 'f']

and a list of numbers

n = [2, 1, 3]

How I can split the list l by the numbers in n ?

And get this list of lists

[['a', 'b'], ['c'], ['d', 'e', 'f']]

Upvotes: 0

Views: 274

Answers (7)

Kasravnd
Kasravnd

Reputation: 107287

You can use numpy.split :

>>> np.split(l,[sum(n[:i]) for i in range(len(n))])
[array([], dtype=float64), array(['a', 'b'], 
      dtype='|S1'), array(['c'], 
      dtype='|S1'), array(['d', 'e', 'f'], 
      dtype='|S1')]

Upvotes: 0

Alexander
Alexander

Reputation: 109528

cuts = [sum(n[:i]) for i in range(len(n) + 1)]
>>> [l[cuts[i]:cuts[i + 1]] for i in range(len(cuts) - 1)]
[['a', 'b'], ['c'], ['d', 'e', 'f']]

This leaves the list intact:

>>> l
['a', 'b', 'c', 'd', 'e', 'f']

Upvotes: 1

Tanveer Alam
Tanveer Alam

Reputation: 5275

I think this would be most optimized as it will only required len(n) number of iterations.

l = ['a', 'b', 'c', 'd', 'e', 'f']
n = [2, 1, 3]

res = []
temp = 0
for i in n:
    res.append(l[temp:temp+i])
    temp = temp+i
print res

Returns:

[['a', 'b'], ['c'], ['d', 'e', 'f']]

Upvotes: 0

JuniorCompressor
JuniorCompressor

Reputation: 20015

You can create an iterator out of the list. Then call next the appropriate number of times.

>>> l = ['a', 'b', 'c', 'd', 'e', 'f']
>>> n = [2, 1, 3]
>>> it = iter(l)
>>> [[next(it) for i in xrange(k)] for k in n]
[['a', 'b'], ['c'], ['d', 'e', 'f']]

Upvotes: 3

Tim
Tim

Reputation: 43304

Yet another way

if __name__ == '__main__':
  l = ['a', 'b', 'c', 'd', 'e', 'f']
  n = [2, 1, 3]

  result = []
  for i in n:
    j = l[:i]
    result.append(j)
    l = l[i:]

  print result

Gives

[['a', 'b'], ['c'], ['d', 'e', 'f']]

It's not as short as some other solutions, but it sure as hell is readable

Upvotes: 1

DSM
DSM

Reputation: 352999

You could use islice:

>>> from itertools import islice
>>> l = ['a', 'b', 'c', 'd', 'e', 'f']
>>> n = [2, 1, 3]
>>> it = iter(l)
>>> out = [list(islice(it, size)) for size in n]
>>> out
[['a', 'b'], ['c'], ['d', 'e', 'f']]

Upvotes: 7

VHarisop
VHarisop

Reputation: 2826

It's a bit obfuscated, but still:

ll = [[l.pop(0) for _ in range(k)] for k in n]

Note that this traversal will not leave the list intact because of the pop() thingy.

Upvotes: 6

Related Questions