2014-09-28 14 views
6

Python 2.7'den Python 3.3'e taşındım ve zip() artık beklendiği gibi çalışmıyor. Gerçekten de, dokümanı okuduğumda artık bir liste yerine bir yineleyici döndürdüğünü okudum.Python3'teki "eski" zip() öğesini nasıl alabilirim?

Peki, bununla nasıl başa çıkacağım? Python3 kodumdaki "eski" zip() kullanabilir miyim? views.py içinde

:

bir Django projede önce çalışmış yol feryat bul my_zipped_list = zip(list1, list2) file.html içinde

: {{ my_zipped_list.0.1 }}

Belki başka bir çözüm "yeni" tutmak olacaktır zip() davranışı ve bunun yerine şablonu değiştirin.

Yardımlarınız için teşekkürler!

+2

Kodunuzu yazmak genellikle daha iyidir, böylece yinelenen bir yineleyici veya bir liste veya başka bir şey olup olmadığı dikkate alınmaz. Bazen bu mümkün değildir, bu durumda ne olursa olsun 'list' fonksiyonuna (veya 'iter' veya 'tuple' ya da yapmaya çalıştığınız şey için uygun olan her şeye geçebilirsiniz. Ama önce, gerçekten ihtiyacınız olup olmadığına bakmaya çalış. – abarnert

+2

zip() listesinin bir iteratöre geri dönmesini döndürmesi, daha önce çalışan kodda sessiz bir hatanın oluşmasına neden olabilir. Hata kod a) bir zip oluşturduğunda oluşur; b) döndürülen değer üzerinde yineleme yapar; c) iade edilen değeri tekrar tekrar gönderir. Zip() bir liste döndürdüğünde, her iki (b) ve (c), sıkıştırılmış listenin üzerinde yineleme yapar. Zip() sadece bir yineleyici döndürdüğünde, (b) sonuçların üzerinde yineleme yapar, ancak (c) sessizce hiçbir şey yapmaz. 2to3'ün bunu yakaladığını sanmıyorum. – PaulMcG

cevap

7

list(zip(...)) yaparak sonucun bir listesini yapın.

+0

Ve bu çözümü aklınızdan çıkarmayın çünkü yineleyicilerin sizin yolunuza geçtiğinde (örneğin, dict.keys() 'vb.) – alexis

+0

@alexis:' dict.keys() 'bir yineleyici değildir. Bu bir görünümdür (2.d'deki "dict.viewkeys()" ile aynı "dict.iterkeys()' ile aynı değildir). – abarnert

+0

Doğru, bu benim söylenmem için özensizdi; Ama bir listeyi beklediğinizde neden aynı olduğunu, neden endeksleyemediğinizi veya neyse. – alexis

İlgili konular