Existe-t-il un moyen pythonique de décompresser une liste dans le premier élément et la "queue" en une seule commande?
Par exemple:
>> head, tail = **some_magic applied to** [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
>> head
1
>>> tail
[1, 2, 3, 5, 8, 13, 21, 34, 55]
Réponses:
Sous Python 3.x, vous pouvez le faire très bien:
Une nouvelle fonctionnalité de 3.x consiste à utiliser l'
*
opérateur lors du déballage, pour signifier toute valeur supplémentaire. Il est décrit dans PEP 3132 - Déballage itérable étendu . Cela a également l'avantage de travailler sur n'importe quel itérable, pas seulement des séquences.C'est aussi très lisible.
Comme décrit dans le PEP, si vous voulez faire l'équivalent sous 2.x (sans potentiellement faire une liste temporaire), vous devez faire ceci:
Comme indiqué dans les commentaires, cela offre également la possibilité d'obtenir une valeur par défaut pour
head
plutôt que de lancer une exception. Si vous voulez ce comportement,next()
prend un deuxième argument optionnel avec une valeur par défaut, doncnext(it, None)
vous donneraitNone
s'il n'y avait pas d'élément head.Naturellement, si vous travaillez sur une liste, le moyen le plus simple sans la syntaxe 3.x est:
la source
__getitem__
/__setitem__
faire l'opération de queue paresseusement, mais pas la liste intégrée.python 3.x
la source
Pour la complexité d'
head,tail
opération O (1) , vous devezdeque
cependant utiliser .Manière suivante:
C'est utile lorsque vous devez parcourir tous les éléments de la liste. Par exemple dans la fusion naïve de 2 partitions en tri par fusion.
la source
head, tail = l.popleft(), l
est ~ O (1).head, tail = seq[0], seq[1:]
est sur).head = l.popleft()
ettail
n'est qu'un alias pourl
. Si lesl
changementstail
changent aussi.Python 2, utilisant lambda
la source
head, tail = lst[0], lst[1:]
? si OP signifie utiliser un littéral, alors il pourrait diviser la tête et la queue manuellementhead, tail = 1, [1, 2, 3, 5, 8, 13, 21, 34, 55]
lst = ...
dans la ligne précédente). (2) Fairehead, tail = lst[0], lst[1:]
laisse le code ouvert aux effets secondaires (considérezhead, tail = get_list()[0], get_list()[1:]
), et est différent de la forme d'Ophead, tail = **some_magic applied to** [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
.En s'appuyant sur la solution Python 2 de @GarethLatty , voici un moyen d'obtenir un équivalent sur une seule ligne sans variables intermédiaires dans Python 2.
Si vous en avez besoin pour être à l'épreuve des exceptions (c'est-à-dire pour supporter une liste vide), ajoutez:
Si vous souhaitez le faire sans le point-virgule, utilisez:
la source