1
votes

Comment diviser une liste en n morceaux de taille, où n est une liste d'entiers itérable?

J'ai une liste de mots et une liste d'entiers 'n'. Comment diviser la liste de mots en morceaux de taille «n» (inégaux)? >


0 commentaires

4 Réponses :


1
votes

Vous pouvez utiliser une compréhension de liste avec iter et next:

[['apple', 'orange'], ['oof'], ['banana', 'apple', 'cherries', 'tomato']]

Output:

words = ['apple', 'orange', 'oof', 'banana', 'apple', 'cherries', 'tomato']
n = ['2', '1', '4']
new_words = iter(words)
result = [[next(new_words) for _ in range(int(i))] for i in n]


0 commentaires

2
votes

Une autre réponse:

output = []
count = 0
for i in range(len(n)):
    chunk_size = int(n[i])
    chunk = []
    for j in range(chunk_size):
        index = (i * j) + j
        chunk.append(words[count])
        count = count + 1
    output.append(chunk)

print(output)


0 commentaires

1
votes

Stratégie O (n) simple:

words = ['apple', 'orange', 'oof', 'banana', 'apple', 'cherries', 'tomato']
n = ['2', '1', '4']
start = 0
out = []
for num in n:
    num = int(num)
    out.append(words[start:start+num])
    start += num


0 commentaires

0
votes

Si vous êtes prêt à importer numpy ou itertools, vous pouvez créer une nouvelle liste avec la somme cumulée et l'utiliser comme index pour créer la sortie souhaitée:

# itertools.accumulate
from itertools import accumulate
m = [0] + list(accumulate([0] + n))

# numpy.cumsum
import numpy as np
m = np.cumsum([0] + n)

# Create new list
[words[i:j] for i, j in zip(m[:-1], m[1:])]


0 commentaires