Dans Python, j'ai une liste de valeurs dont j'ai besoin de rompre dans des tableaux plus petits en fonction des valeurs d'un autre tableau. Par exemple, j'ai cette gamme de chiffres: et j'en ai besoin pour se transformer en ce tableau: p> donné que j'ai cette matrice spécifiant les longueurs des parties cassées: p> J'ai essayé de regarder la documentation de remodelage numpy, et cette fonction semble faire ce que je veux, mais je ne suis pas Assurez-vous comment le faire fonctionner sans modifier l'ensemble de la matrice et le faire de manière essentiellement une «variable». J'ai également essayé de le faire à travers des boucles mais je ne peux pas sembler obtenir les indices pour fonctionner correctement. P> p>
4 Réponses :
En supposant que la somme des longueurs est toujours la même que la longueur de la liste, vous pouvez utiliser sortie: p> Remarque: list.pop (0) code>:
list.pop code> Par défaut apparaît le dernier élément STRAND> ", donc
list.pop (0) < / code> est utilisé. p> p>
Si vous ne voulez pas inciter le coût supplémentaire d'élimination des éléments d'une liste, voici une façon de le faire, en utilisant le tester: strong> p> sortie: strong> p> ithertools.lice () code>:
Vous n'avez pas besoin de 0 comme début d'Islice, c'est la valeur par défaut. Juste islice (itérateur, longueur).
@Veky, vrai, mais sans doute, cela aide la lisibilité à mentionner le début de toute façon.
Pour moi, c'est la même chose que la plage. Si vous écrivez régulièrement la plage (0, 5) au lieu de la plage (5), alors je vous comprends, mais j'en doute. : -]
@Veky, vous gagnez - j'utilise régulièrement plage (5) code> plutôt que
plage (0,5) code>. Je modifierai la réponse pour vous débarrasser du
0 code>
En fait, je comprends votre malaise. Ce paramètre "Démarrer" est le seul endroit dans Core Python où les arguments par défaut ne vont pas "de la fin" -1, -2, -3, mais -1, -3, -2. Mais comme nous l'avons tellement habitué avec une portée, il serait dommage de ne pas utiliser le même idiome ici; De plus, depuis dans mon expérience, nous islice du début encore plus souvent que nous allons de 0.
Si vous avez besoin de faire cette procédure pour de nombreuses listes, il peut être agréable d'avoir une fonction prédéfinie. Voici un, écrit complètement à l'aide de la plus hauteOrderPHONHON.
from itertools import accumulate, tee, chain from operator import itemgetter i2, i3 = tee(accumulate([3, 2, 2, 1, 3, 2])) slicer = itemgetter(*map(slice, chain([None], i2), i3)) >>> print(slicer([6, 5, 3, 1, 4, 3, 2, 4, 1, 3, 6, 1])) ([6, 5, 3], [1, 4], [3, 2], [4], [1, 3, 6], [1])
solution à l'aide d'un générateur est ci-dessous.
my_list = [6, 5, 3, 1, 4, 3, 2, 4, 1, 3, 6, 1] my_lens = [3, 2, 2, 1, 3, 1] ans = [x for x in splitter(my_list, my_lens)] print(ans) # [[6, 5, 3], [1, 4], [3, 2], [4], [1, 3, 6], [1]] text = 'a quick brown fox jumped over the lazy dog' lengths = [2, 6, 6, 4, 7, 5, 4, 5, 3] print([x for x in splitter(text, lengths)]) # ['a ', 'quick ', 'brown ', 'fox ', 'jumped ', 'over ', 'the ', 'lazy ', 'dog'] my_tuple = (6, 5, 3, 1, 4, 3, 2, 4, 1, 3, 6, 1) my_lens = [3, 2, 2, 1, 3, 1] print(tuple(x for x in splitter(my_tuple, my_lens))) # ((6, 5, 3), (1, 4), (3, 2), (4,), (1, 3, 6), (1,))
Soyez clair, quand parlez-vous de Python
Listes CODE>, et lorsque
Numby Numpy code>
Tableaux code>. Ou utilisez-vous simplement
tableau code> pour signifier la même chose que les listes.
Numpy code> a une fonction
Split code>, mais tout ce qu'il fait est de prendre un tas de tranches. Collant avec votre liste:
[Alist [0: 3], Alist [3: 5], Alist [5: 7], Alist [7: 8], ....] code>.