Pourquoi ne x,y = zip(*zip(a,b)) travail en Python?
OK j'adore Python zip()
fonction. L'utiliser tout le temps, c'est génial. Chaque maintenant et encore, je veux faire le contraire de zip()
, pense "que j'ai utilisé pour savoir comment le faire", puis google python décompressez, puis rappelez-vous que l'on utilise cette magique *
pour décompresser une zippée liste de tuples. Comme ceci:
x = [1,2,3]
y = [4,5,6]
zipped = zip(x,y)
unzipped_x, unzipped_y = zip(*zipped)
unzipped_x
Out[30]: (1, 2, 3)
unzipped_y
Out[31]: (4, 5, 6)
Ce qui sur terre se passe? Ce qui est magique astérisque faire? Où d'autre peut-il être appliqué et que d'autres belles choses incroyables en Python sont si mystérieux et difficile à google?
- Dupliquer: stackoverflow.com/questions/2233204/...
- oh ouais. C'est exactement le problème, la recherche de stackoverflow pour
zip(*
python n'a pas de retour de la double question sur la première page, et googler pourpython *
oupython zip(*
ne retourne pas beaucoup j'imagine, parce que la(*
est ignoré? Vous avez raison de bien, quelqu'un d'autre aussi pensé que c'était génial. Dois-je supprimer la question? - Je n'aurais pas le supprimer car il les rangs supérieur à la recherche pour une raison quelconque. Fermeture elle permettrait d'assurer une redirection.
- J'ai trouvé le lien dans ma réponse par la recherche "site:docs.python.org astérisque". Le mot "astérisque" est beaucoup plus facile pour les moteurs de recherche que d'une réelle astérisque. 🙂
- "ce que d'autres belles choses incroyables en Python sont si mystérieux et difficile à google?" Découvrez: stackoverflow.com/questions/101268/hidden-features-of-python pour la réponse 🙂
Vous devez vous connecter pour publier un commentaire.
L'astérisque en Python est décrite dans le tutoriel Python, sous Déballage Des Listes D'Arguments.
L'astérisque effectue
apply
(comme il est connu en Lisp et Scheme). Fondamentalement, il faut que votre liste, et appelle la fonction avec la liste du contenu en tant qu'arguments.apply
fonction, mais je ne pense pas qu'il existe des cas d'utilisation qui ne peuvent pas être couverts par*
. Je crois qu'il a été retiré de Python3apply
est répertorié dans le python.org/dev/peps/pep-0361, sous la rubriqueWarnings for features removed in Py3k:
Il est également utile pour plusieurs args:
Et, vous pouvez utiliser l'astérisque double pour le mot-clé arguments et les dictionnaires:
Et bien sûr, vous pouvez combiner ces:
Très soigné et des trucs utiles.
Il ne fonctionne pas toujours:
Oups! Je pense qu'il a besoin d'un crâne à l'effrayer en travail:
En python3, je pense que vous avez besoin
depuis zip retourne maintenant un générateur de fonction qui n'est pas Faux-y.
unzipped_x = (z[0] for z in zipped)
. Sizipped
est lui-même un générateur de convertir une liste en premier, de sorte que vous pouvez parcourir à nouveau pourunzipped_y
. Il n'y a pas de coût supplémentaire contrezip(*zipped)
, car ce dernier se convertit égalementzipped
à une liste dans le processus de déballage de l'argumentation.Je suis extrêmement Python donc ce tout récemment trébuché moi, mais il doit en plus faire avec la façon dont l'exemple a été présenté et ce qui a été souligné.
Ce qui m'a donné des problèmes avec la compréhension de la zip exemple a été l'asymétrie dans le traitement de la zip de retour d'appel de valeur(s). C'est, lorsque le zip est appelée la première fois, la valeur de retour est affecté à une seule variable, afin de créer une liste de référence (contenant le créé tuple de la liste). Dans le deuxième appel, il exploite Python possibilité de décompresser automatiquement une liste (ou d'une collection?) valeur de retour dans de multiples références à des variables, chaque référence étant la personne tuple. Si quelqu'un n'est pas familier avec la façon qui fonctionne en Python, il est plus facile de se perdre à ce qui se passe réellement.
Additif à @bcherry réponse:
De sorte qu'il fonctionne non seulement avec le mot-clé arguments (dans ce sens strict), mais avec des arguments nommés trop (aka de position arguments).
(x, y) == tuple(zip(*zip(x,y)))
est vrai si et seulement si les deux énoncés suivants sont vrais:x
ety
ont la même longueurx
ety
sont des n-upletsUn bon moyen de comprendre ce qui se passe est de l'impression à chaque étape:
Sorties:
Fondamentalement, ce est ce qui se passe:
x
ety
sont jumelés en fonction de leurs indices respectifs.(1, 2, 3)
('a', 'b', 'c')
Maintenant vous pouvez comprendre pourquoi
(x, y) == tuple(zip(*zip(x,y)))
est faux dans ce cas:y
est plus quex
, le premier zip opération supprimé l'élément supplémentaire dey
(comme il ne pouvait pas être jumelés), ce changement est évidemment repercuted sur la deuxième opération de compressionzip
n'paire d'éléments de n-uplets et pas dans les listesSi vous n'êtes pas 100% certain de comprendre comment
zip
travail, j'ai écrit une réponse à cette question ici: la Décompression et l'opérateur *