J'essaie d'apprendre à "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
, chacune de taille 20.
Maintenant oui:
zipall = Zip(x1, x2, x3)
Cependant, quand je le fais:
print "len of zipall %s" % len(zipall)
J'en ai 20, ce qui n'est pas ce à quoi je m'attendais. Je m'attendais à trois. Je pense que je fais quelque chose de fondamentalement faux.
Lorsque vous Zip()
réunissez trois listes contenant chacune 20 éléments, le résultat contient vingt éléments. Chaque élément est un triple.
Voir par vous-même:
In [1]: a = b = c = range(20)
In [2]: Zip(a, b, c)
Out[2]:
[(0, 0, 0),
(1, 1, 1),
...
(17, 17, 17),
(18, 18, 18),
(19, 19, 19)]
Pour connaître le nombre d'éléments contenus dans chaque tuple, vous pouvez examiner la longueur du premier élément:
In [3]: result = Zip(a, b, c)
In [4]: len(result[0])
Out[4]: 3
Bien sûr, cela ne fonctionnera pas si les listes étaient vides pour commencer.
Zip
prend un tas de listes j'aime
a: a1 a2 a3 a4 a5 a6 a7...
b: b1 b2 b3 b4 b5 b6 b7...
c: c1 c2 c3 c4 c5 c6 c7...
et les "zippe" dans une liste dont les entrées sont 3-tuples (ai, bi, ci)
. Imaginez dessiner une fermeture à glissière horizontalement de gauche à droite.
Dans Python2.7, cela aurait peut-être bien fonctionné:
>>> a = b = c = range(20)
>>> Zip(a, b, c)
Mais dans Python3.4 il devrait l'être (sinon, le résultat sera quelque chose comme <Zip object at 0x00000256124E7DC8>
):
>>> a = b = c = range(20)
>>> list(Zip(a, b, c))
Zip
crée une nouvelle liste, remplie de nuplets contenant des éléments à partir des arguments itérables:
>>> Zip ([1,2],[3,4])
[(1,3), (2,4)]
Je m'attends à ce que vous essayiez de créer un tuple où chaque élément est une liste.
Fondamentalement, la fonction Zip fonctionne sur les listes, les n-uplets 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
a = ['a', 'b', 'c']
b = ['p', 'q', 'r']
Zip(a, b)
La sortie est [('a', 'p'), ('b', 'q'), ('c', 'r')
Pour dictionnaire:
c = {'gaurav':'waghs', 'nilesh':'kashid', 'ramesh':'sawant', 'anu':'raje'}
d = {'amit':'wagh', 'swapnil':'dalavi', 'anish':'mane', 'raghu':'rokda'}
Zip(c, d)
La sortie est:
[('gaurav', 'amit'),
('nilesh', 'swapnil'),
('ramesh', 'anish'),
('anu', 'raghu')]
Source: Mon blog (meilleure mise en forme)
Exemple
numbers = [1,2,3]
letters = 'abcd'
Zip(numbers, letters)
# [(1, 'a'), (2, 'b'), (3, 'c')]
Zéro ou plusieurs iterables [1] (ex. Liste, chaîne, tuple, dictionnaire)
1er tuple = (élément_1 de nombres, élément_1 de lettres)
2e tuple = (e_2 chiffres, e_2 lettres)
…
nième th = = (e_n nombres, e_n lettres)
i
th Tuple = (élément_i arg1, élément_i arg2…, élément_i argn
)1) Chaîne vide: len (str) = 0 = pas de tuples
2) Chaîne unique: len (str) == 2 tuples avec len (arguments) == 1 élément (s)
Zip()
# []
Zip('')
# []
Zip('hi')
# [('h',), ('i',)]
1. Construisez un dictionnaire [2] sur deux listes
keys = ["drink","band","food"]
values = ["La Croix", "Daft Punk", "Sushi"]
my_favorite = dict( Zip(keys, values) )
my_favorite["drink"]
# 'La Croix'
my_faves = dict()
for i in range(len(keys)):
my_faves[keys[i]] = values[i]
Zip
est une solution élégante, claire et concise2. Imprimer des colonnes dans un tableau
"*" [3] est appelé "décompression": f(*[arg1,arg2,arg3]) == f(arg1, arg2, arg3)
student_grades = [
[ 'Morty' , 1 , "B" ],
[ 'Rick' , 4 , "A" ],
[ 'Jerry' , 3 , "M" ],
[ 'Kramer' , 0 , "F" ],
]
row_1 = student_grades[0]
print row_1
# ['Morty', 1, 'B']
columns = Zip(*student_grades)
names = columns[0]
print names
# ('Morty', 'Rick', 'Jerry', 'Kramer')
Zip(*args)
est appelé “décompression” car il a l'effet inverse de Zip
numbers = (1,2,3)
letters = ('a','b','c')
zipped = Zip(numbers, letters)
print zipped
# [(1, 'a'), (2, 'b'), (3, 'c')]
unzipped = Zip(*zipped)
print unzipped
# [(1, 2, 3), ('a', 'b', 'c')]
unzipped
: Tuple_1 = e1 de chaque tuple compressé. Tuple_2 = e2 de chaque zipped
*
Code:
# foo - function, returns sum of two arguments
def foo(x,y):
return x + y
print foo(3,4)
# 7
numbers = [1,2]
print foo(numbers)
# TypeError: foo() takes exactly 2 arguments (1 given)
print foo(*numbers)
# 3
*
a pris numbers
(1 argument) et a "décompacté" ses 2 éléments en 2 arguments
Par souci de complétude.
Lorsque la longueur des listes compressées n'est pas la même. La longueur de la liste de résultats deviendra la plus courte sans qu'aucune erreur ne se produise
>>> a = [1]
>>> b = ["2", 3]
>>> Zip(a,b)
[(1, '2')]
Dans PythonZip
renvoie un itérateur à la place et doit être passé à une fonction de liste pour obtenir les n-uplets compressés:
x = [1, 2, 3]; y = ['a','b','c']
z = Zip(x, y)
z = list(z)
print(z)
>>> [(1, 'a'), (2, 'b'), (3, 'c')]
Ensuite, pour unzip
revenir en arrière, il suffit de conjuguer l’itérateur compressé:
x_back, y_back = Zip(*z)
print(x_back); print(y_back)
>>> (1, 2, 3)
>>> ('a', 'b', 'c')
Si la forme originale de liste est nécessaire à la place de tuples:
x_back, y_back = Zip(*z)
print(list(x_back)); print(list(y_back))
>>> [1,2,3]
>>> ['a','b','c']
Je ne pense pas que Zip
renvoie une liste. Zip
renvoie un générateur. Vous devez faire list(Zip(a, b))
pour obtenir une liste de n-uplets.
x = [1, 2, 3]
y = [4, 5, 6]
zipped = Zip(x, y)
list(zipped)