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 zipde 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. :-)