2014-09-28 5 views
6

Ich habe von Python 2.7 auf Python 3.3 migriert und zip() funktioniert nicht mehr wie erwartet. Tatsächlich habe ich im Dokument gelesen, dass es jetzt einen Iterator anstelle einer Liste zurückgibt.Wie kann ich die "alte" zip() in Python3 bekommen?

Also, wie soll ich damit umgehen? Kann ich den "alten" zip() in meinem Python3-Code verwenden?

Finden Sie den Weg es funktionierte, bevor in einem Django-Projekt unten:

in views.py: my_zipped_list = zip(list1, list2)

in file.html: {{ my_zipped_list.0.1 }}

Vielleicht wäre eine andere Lösung zu halten "neu" sein Zip() Verhalten und ändern Sie stattdessen Vorlage.

Vielen Dank für Ihre Hilfe!

+2

Es ist normalerweise besser, den Code zu schreiben, so dass es egal ist, ob er einen Iterator oder eine Liste oder irgendetwas anderes hat, solange es iterierbar ist. Manchmal ist das nicht möglich. In diesem Fall müssen Sie alle iterierbaren Funktionen an die Funktion "list" (oder "iter" oder "tuple" oder was auch immer für das, was Sie tun möchten, anpassen) übergeben. Aber zuerst, versuchen Sie zu sehen, ob Sie tatsächlich müssen. – abarnert

+2

Die Konvertierung von zip() vom Zurückgeben einer Liste zum Zurückgeben eines Iterators kann zu einem stillen Fehler in früher funktionierendem Code führen. Der Fehler tritt auf, wenn Code a) eine Zip-Datei erstellt; b) iteriert über den zurückgegebenen Wert; c) iteriert den zurückgegebenen Wert erneut. Wenn zip() eine Liste zurückgibt, durchlaufen beide (b) und (c) die gezippte Liste. Wenn zip() nur einen Iterator zurückgibt, (b) iteriert es über die Ergebnisse, aber (c) führt im Hintergrund nichts aus. Ich glaube nicht, dass 2to3 das auch auffängt. – PaulMcG

Antwort

7

Machen Sie einfach eine Liste der Ergebnisse, indem Sie list(zip(...)) tun.

+0

Und behalten Sie diese Lösung im Hinterkopf, weil Sie sie oft brauchen, wenn Iteratoren Ihnen im Weg stehen (zB mit 'dict.keys()' etc.) – alexis

+0

@alexis: 'dict.keys()' ist kein Iterator Es ist eine Ansicht (das gleiche wie 'dict.viewkeys()' in 2.x, nicht dasselbe wie 'dict.iterkeys()'). – abarnert

+0

Richtig, das war schlampig von mir zu sagen; Aber es ist egal, wenn Sie eine Liste erwarten, die Sie nicht verstehen, warum Sie sie nicht indexieren können oder was auch immer. – alexis

Verwandte Themen