J'essaye d'apprendre comment «compresser» des listes. À cette fin, j'ai un programme, où à un moment donné, je fais ce qui suit:
x1, x2, x3 = stuff.calculations(withdataa)
Cela me donne trois listes, x1
, x2
et x3
, chacun, par exemple, la taille 20.
Maintenant oui:
zipall = zip(x1, x2, x3)
Cependant, quand je fais:
print "len of zipall %s" % len(zipall)
J'en ai 20, ce qui n'est pas ce à quoi je m'attendais. J'en attendais trois. Je pense que je fais quelque chose de fondamentalement mal.
zip
faire exactement ? Pourquoi devriez-vous avoir trois listes - à quoi ressembleraient-elles?Réponses:
Lorsque vous
zip()
regroupez trois listes contenant chacune 20 éléments, le résultat a vingt éléments. Chaque élément est un triplet.Voir par vous-même:
Pour savoir combien d'éléments chaque tuple contient, vous pouvez examiner la longueur du premier élément:
Bien sûr, cela ne fonctionnera pas si les listes étaient vides au départ.
la source
zip
renvoyé une liste. Dans Python 3 c'est un itérateurzip
prend un tas de listes de likeset les "zips" dans une liste dont les entrées sont 3-tuples
(ai, bi, ci)
. Imaginez dessiner une fermeture à glissière horizontalement de gauche à droite.la source
En Python 2.7, cela aurait pu fonctionner correctement:
Mais dans Python 3.4, cela devrait être (sinon, le résultat sera quelque chose comme
<zip object at 0x00000256124E7DC8>
):la source
zip
crée une nouvelle liste, remplie de tuples contenant des éléments des arguments itérables:J'attends ce que vous essayez de créer un tuple où chaque élément est une liste.
la source
Source: Mon article de blog (meilleur formatage)
Exemple
Contribution
Zéro ou plusieurs itérables [1] (ex. Liste, chaîne, tuple, dictionnaire)
Sortie (liste)
i
th tuple = (element_i arg1, element_i arg2…, element_i argn
)Cas de bord
1) Chaîne vide: len (str) = 0 = pas de tuples
2) Chaîne unique: len (str) == 2 tuples avec len (args) == 1 élément (s)
Zip en action!
1. Construisez un dictionnaire [2] à partir de deux listes
zip
est une solution élégante, claire et concise2. Imprimer des colonnes dans un tableau
"*" [3] est appelé "déballage":
f(*[arg1,arg2,arg3]) == f(arg1, arg2, arg3)
Crédit supplémentaire: décompression
zip(*args)
est appelé «décompression» car il a pour effet inversezip
unzipped
: tuple_1 = e1 de chaque tuple compressé. tuple_2 = e2 de chaquezipped
Notes de bas de page
*
Code:*
a prisnumbers
(1 argument) et a «déballé» ses 2 éléments en 2 argumentsla source
Fondamentalement, la fonction zip fonctionne sur les listes, les tuples et les dictionnaires en Python. Si vous utilisez IPython, tapez simplement zip? Et vérifiez en quoi consiste zip ().
Si vous n'utilisez pas IPython, installez-le simplement: "pip install ipython"
Pour les listes
La sortie est
[('a', 'p'), ('b', 'q'), ('c', 'r')
Pour le dictionnaire:
La sortie est:
la source
En Python 3
zip
renvoie un itérateur à la place et doit être passé à une fonction de liste pour obtenir les tuples compressés:Ensuite
unzip
, il suffit de conjuguer l'itérateur zippé:Si la forme originale de la liste est nécessaire au lieu des tuples:
la source
Par souci d'exhaustivité.
Lorsque les longueurs des listes compressées ne sont pas égales. La longueur de la liste de résultats deviendra la plus courte sans qu'aucune erreur ne se soit produite
la source
Je ne pense pas que
zip
renvoie une liste.zip
renvoie un générateur. Vous devez fairelist(zip(a, b))
pour obtenir une liste de tuples.la source
Cela vaut la peine d'ajouter ici car c'est une question très bien classée sur zip.
zip
est génial, Python idiomatique - mais il ne s'adapte pas très bien du tout aux grandes listes.Au lieu de:
Utilisez
izip
. Pour le traitement moderne, il le stocke dans la mémoire cache L1 et est beaucoup plus performant pour les listes plus grandes. Utilisez-le aussi simplement que d'ajouter uni
:la source