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:])]