Bu akıllıca bir parça.
İlk olarak, bir yorumda belirtildiği gibi, Python 3'te zip()
bir yineleyici döndürür, bu nedenle list()
gerçek bir listeyi geri almak için her şeyi içine almanız gerekir , böylece 2020 itibariyle aslında:
list(zip(*original[::-1]))
İşte döküm:
[::-1]
- orijinal listenin yüzeysel bir kopyasını ters sırada yapar. reversed()
Listeyi gerçekte kopyalamak yerine, liste üzerinde bir ters yineleyici üretecek olanı da kullanabilir (bellek açısından daha verimli).
*
- orijinal listedeki her bir alt listeyi ayrı bir argüman haline getirir zip()
(yani, listeyi kaldırır)
zip()
- her argümandan bir öğe alır ve bunlardan bir liste (iyi, bir demet) yapar ve tüm alt listeler tükenene kadar tekrar eder. Transpozisyonun gerçekte olduğu yer burasıdır.
list()
çıktısını zip()
bir listeye dönüştürür .
Buna sahip olduğunuzu varsayarsak:
[ [1, 2, 3],
[4, 5, 6],
[7, 8, 9] ]
Önce bunu alırsınız (sığ, tersine çevrilmiş kopya):
[ [7, 8, 9],
[4, 5, 6],
[1, 2, 3] ]
Daha sonra alt listelerin her biri bir argüman olarak şunlara iletilir zip
:
zip([7, 8, 9], [4, 5, 6], [1, 2, 3])
zip()
argümanlarının her birinin başından bir öğeyi art arda tüketir ve başka öğe kalmayana kadar ondan bir demet oluşturur, sonuçta (bir listeye dönüştürüldükten sonra):
[(7, 4, 1),
(8, 5, 2),
(9, 6, 3)]
Ve Bob senin amcan.
@ IkeMiguel'in sorusunu, onu diğer yöne döndürmekle ilgili bir yorumda yanıtlamak oldukça basittir: hem giren dizileri hem zip
de sonucu tersine çevirmeniz yeterlidir . Birincisi kaldırılarak elde edilebilir [::-1]
ve ikincisi reversed()
her şeyin etrafına bir fırlatılarak elde edilebilir . Yana reversed()
listesi üzerinde döner bir yineleyici, biz koymak gerekir list()
etrafında o dönüştürmek için. list()
Yineleyicileri gerçek bir listeye dönüştürmek için birkaç ekstra çağrı ile. Yani:
rotated = list(reversed(list(zip(*original))))
Bunu biraz "Marslı gülen" dilimini kullanarak basitleştirebiliriz reversed()
... o zaman dış kısma ihtiyacımız olmaz list()
:
rotated = list(zip(*original))[::-1]
Elbette, listeyi saat yönünde üç kez de döndürebilirsiniz. :-)