Ik probeer te leren hoe ik lijsten kan “zippen”. Hiertoe heb ik een programma, waarbij ik op een bepaald moment het volgende doe:
x1, x2, x3 = stuff.calculations(withdataa)
Dit geeft me drie lijsten, x1
, x2
en x3
, elk van bijvoorbeeld maat 20.
Nu doe ik:
zipall = zip(x1, x2, x3)
Als ik dat echter doe:
print "len of zipall %s" % len(zipall)
Ik krijg 20, wat niet is wat ik had verwacht. Ik had er drie verwacht. Ik denk dat ik iets fundamenteel verkeerd doe.
Antwoord 1, autoriteit 100%
Als je zip()
samen drie lijsten met elk 20 elementen samenvoegt, heeft het resultaat twintig elementen. Elk element is een drie-tupel.
Zie het zelf:
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)]
Om erachter te komen hoeveel elementen elke tupel bevat, kun je de lengte van het eerste element bekijken:
In [3]: result = zip(a, b, c)
In [4]: len(result[0])
Out[4]: 3
Dit werkt natuurlijk niet als de lijsten om te beginnen leeg waren.
Antwoord 2, autoriteit 28%
zip
neemt een heleboel lijsten met likes op
a: a1 a2 a3 a4 a5 a6 a7...
b: b1 b2 b3 b4 b5 b6 b7...
c: c1 c2 c3 c4 c5 c6 c7...
en “zipt” ze in één lijst waarvan de items 3-tupels (ai, bi, ci)
zijn. Stel je voor dat je een rits horizontaal van links naar rechts tekent.
Antwoord 3, autoriteit 17%
In Python 2.7 zou dit prima kunnen werken:
>>> a = b = c = range(20)
>>> zip(a, b, c)
Maar in Python 3.4 zou het zo moeten zijn (anders is het resultaat zoiets als <zip object at 0x00000256124E7DC8>
):
>>> a = b = c = range(20)
>>> list(zip(a, b, c))
Antwoord 4, autoriteit 12%
zip
maakt een nieuwe lijst, gevuld met tuples met elementen uit de itereerbare argumenten:
>>> zip ([1,2],[3,4])
[(1,3), (2,4)]
Ik verwacht dat je probeert een tuple te maken waarbij elk element een lijst is.
Antwoord 5, autoriteit 6%
In Python 3zip
retourneert in plaats daarvan een iterator en moet worden doorgegeven aan een lijstfunctie om de gecomprimeerde tupels te krijgen:
x = [1, 2, 3]; y = ['a','b','c']
z = zip(x, y)
z = list(z)
print(z)
>>> [(1, 'a'), (2, 'b'), (3, 'c')]
Om ze vervolgens te unzip
voeg je gewoon de gecomprimeerde iterator toe:
x_back, y_back = zip(*z)
print(x_back); print(y_back)
>>> (1, 2, 3)
>>> ('a', 'b', 'c')
Als de originele lijstvorm nodig is in plaats van tupels:
x_back, y_back = zip(*z)
print(list(x_back)); print(list(y_back))
>>> [1,2,3]
>>> ['a','b','c']
6, Autoriteit 5%
In principe werkt de ZIP-functie op lijsten, tuples en woordenboeken in Python.
Als u IPYTHON gebruikt, typt u gewoon zip? En controleer over welke zip () ongeveer is.
Als u IPYTHON niet gebruikt, installeer het dan gewoon: “PIP INSTALLATE IPYTHON”
voor lijsten
a = ['a', 'b', 'c']
b = ['p', 'q', 'r']
zip(a, b)
De uitvoer is [('a', 'p'), ('b', 'q'), ('c', 'r')
Voor woordenboek:
c = {'gaurav':'waghs', 'nilesh':'kashid', 'ramesh':'sawant', 'anu':'raje'}
d = {'amit':'wagh', 'swapnil':'dalavi', 'anish':'mane', 'raghu':'rokda'}
zip(c, d)
De uitvoer is:
[('gaurav', 'amit'),
('nilesh', 'swapnil'),
('ramesh', 'anish'),
('anu', 'raghu')]
7, Autoriteit 3%
voor de volledigheid.
Wanneer de lengtes van ritslijsten niet gelijk zijn.
De lengte van het resultaatlijst wordt de kortste en zonder enige fout opgetreden
>>> a = [1]
>>> b = ["2", 3]
>>> zip(a,b)
[(1, '2')]
8
Het is de moeite waard om hier de moeite toe te voegen, want het is een dergelijke zeer rangorde vraag over ZIP. zip
is geweldig, idiomatisch python – maar het is helemaal niet goed voor grote lijsten.
in plaats van:
books = ['AAAAAAA', 'BAAAAAAA', ... , 'ZZZZZZZ']
words = [345, 567, ... , 672]
for book, word in zip(books, words):
print('{}: {}'.format(book, word))
Gebruik izip
. Voor moderne verwerking slaat het het op in L1 Cache-geheugen en is het veel performanter voor grotere lijsten. Gebruik het net zo eenvoudig als het toevoegen van een i
:
for book, word in izip(books, words):
print('{}: {}'.format(book, word))
Antwoord 9
Ik denk niet dat zip
een lijst retourneert. zip
retourneert een generator. Je moet list(zip(a, b))
doen om een lijst met tuples te krijgen.
x = [1, 2, 3]
y = [4, 5, 6]
zipped = zip(x, y)
list(zipped)