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)? >
4 Réponses :
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]
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)
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
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:])]