Pythonban hogy kell beállítani, hogy a for ciklus a lista hátuljáról induljon?
Ne használj "for i in range(len......" -t, lépkedj végig az elemeken ahogy az első írta. (Ha mégis így tennél, akkor "for i in range(len(lista) - 1, -1, -1):" lenne, de NE MERÉSZELD így használni. A 3. paraméter mondja meg, hogy mínuszegyesével lépkedsz.
Egy másik hasznos funkció a listák szeletelése (slicing): a "lista[::-1]" a listád fordított másolatát adja. Lásd: [link]
Alapvetően amikor visszafele iterálsz a reversed segítségévével akkor lényegében a listából (vagy egyéb kollekcióból) képzett reversediterator-on iterálsz végig pontosan. És valószínűleg, bár ebben most nem vagyok 100%-ig biztos, de szerintem a reversediterator-oknak a __next__ metódusa úgy van implementálva, hogy hátulról kezdi az indexelést, és minden iterációlépésnél csökkenti az indexet és így valósítja meg a visszafele iterációt.
Ha van aki tud erről valamit, akkor az érdekelne, gyors googlizás után most nem találtam kielégítő választ erre.
Minden beépített nyelvi elemet szabad használni. Azon lehet lamentálni hogyha egy adott dologra több közül is lehet választani valamit akkor melyiket érdemesebb.
A lista[::-1] megfordítása csupán a fordítva bejárás miatt több overhead-al jár mint indokolt lenne. Hiszen létrehoz belőle egy fordított másolatot amit így is úgy is be kell járni, hiszen ez a cél, de ha nem is megy végig rajta mert van a cikluson belül egy if break, akkor a fordított lista többi része fel sincs használva semmire, de mégis le kellett gyártani.
A reversed csinál egy list_reverseiterator objektumot ami igen valóban úgy van implementálva hogy nem másolja le a listát csak végig vagy ameddig léptetjük addig iterál rajta hátulról előre haladva.
Beépített nyelvi elemként natív kódban implementálva c-ben: [link]
A 3080-as sortól ezen forráskód végéig ezen iterátor implenetációja van.
Jólvan, látom itt olyan született programtervező informatikusok vannak, akik a foreach ciklusba is számlálót tesznek (kivéve 1. 5. 6. mert ők látják a lényeget). Lehet, hogy kevés volt a Greenfox? :((( Az se zavarjon meg senkit, hogy a reversed()-et javasoltam neki én is, és egyedül én mutattam meg a range "helyes" használatát a hátulról lépkedésre. Összedobtam egy egyszerű példát, amiben az enumerate() 20%-kal gyorsabb volt néhány elem feltételes cseréjénél, mint az index alapján történő lekérdezés, ha valamiért olyan nagyon kéne neki az az index. És ez csak egy szándékosan gyökér példa. Szóval nem én fogok sírni a sebesség miatt. De használjátok csak bátran a range(len())-t, addig sem kell féltenem az állásomat... :'D
U.i.: ha azt írom, hogy a [::-1] egy másolatot ad, az szerintem egyértelmű hogy nagyobb overheadet jelent egy reversediteratorhoz képest...
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!