Zip lijsten in Python

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, x2en 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%

zipneemt 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%

zipmaakt 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 3zipretourneert 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 unzipvoeg 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. zipis 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 zipeen lijst retourneert. zipretourneert 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)

Other episodes