Tills motsatsen har bevisats så postulerar jag att det är överhängande sannolikhet att det är något i designsteget som tänkts fel om man känner att man behöver skriva "traditionella" for
-loopar i Python (även om de implementeras med while
-syntax).
Det du vill göra är dock aningens exotiskt, så kan gå utanför de allra enklaste konstruktionerna. Du vill plocka ut första elementet i en lista och sedan jämföra det mot alla andra element i listan, om jag förstår det rätt. Ett sätt är att dela upp listan med extended iterable unpacking:
first, *rest = myList
for item in rest:
...
Alternativt kan du slice:a listan i loopvillkoret och skriva något i stil med:
first = myList[0]
for item in myList[1:]:
...
Notera att detta är väldigt likt det förra exemplet, men fulare . Det första exemplet är i mina ögon tydligare i sin intention.
Aningens trevligare, men fortfarande fult, är en variant likt:
first = myList.pop(0)
for item in myList:
...
Notera att detta "förstör" myList
genom att faktiskt ta bort dess första element. pop(0)
är en dyr operation (O(n)) i Python beroende på hur listor implementeras. Känner man att man ofta behöver lägga till eller ta bort element från början av en lista så använder man fel datatyp och borde titta på deque i stället.
Är man rädd för att det blir för mycket overhead i ovanstående lösningar så kan man skapa en manuell iterator och iterera den ett steg utanför loopen innan man går över hela listan:
myList_iterator = iter(myList)
first = next(myList_iterator)
for item in myList_iterator:
...
(Notis om namnkonventioner: "camelCase" används generellt inte i Python — PEP 8 ger vedertagna konventioner. Jag använde suffixet _iterator
som en protest . )
För att förtydliga så kommer alltså alla lösningar ovan i sina respektive loop-block tillgängliggöra första listelementet som first
och övriga element itereras över som item
.
Jag skulle nog föredragit den första lösningen för att den är "mysigast" att läsa. Den andra och tredje varianten där man blandar in explicita listindex är otrevligare. Den fjärde är OK, och att föredra om listan är väldigt stor (där "väldigt stor" syftar på "jag är glad om jag ens får plats med en kopia av listan i minnet!"). Man skulle också kunna tänka sig varianter där man kastar bort den gamla listan genom att exempelvis modifiera det första exemplet med tilldelning till *myList
snarare än *rest
, men man behöver ändå vänta på skräpsamlaren innan man kan garantera något om använt minne, och det ser inte lika tydligt ut.
Om du utför rena prestandatester så kommer du märka att den I/O du gör (då jag sedan tidigare vet att du plockar data från Google Maps i ditt projekt) dominerar tidsmässigt med många storleksordningar likväl, så jag skulle rekommendera att tänka "läsbarhet" snarare än "prestandamonster i varje steg!".
Varianter där man blandar in range
, len
, etc., är i mina ögon tecken på Python skrivet av någon som inte gillar att skriva Python (behöver man faktiskt indexera en lista så bör man i stället titta närmre på standardbibliotekets enumerate).
Disclaimer: "Fult" är generellt ett subjektivt begrepp som i denna text används i någon sorts motsats till vad som brukar kallas "Pythonic" (cf. import this
).