Trädvy Permalänk
Medlem
Registrerad
Jun 2012

for loop python

Hej, har försökt få till en for loop i python men ser att den fungerar som någon sorts for each. Så finns det något sätt att göra en loop som ser ut ungeför så här i python?

for(int i = 0; i < myList[-1]; i++) { }

Har såhär just nu, men det fungerar inte som jag vill, då jag vill kunna loopa igenom en lista.

for cord in myList: my_distance = gmaps.distance_matrix(myList[0], myList[1:]) travelTime = (my_distance['rows'][0]['elements'][0]['distance']['value']) print my_distance print travelTime

Jag har hämtat ett antal positioner och vill jämföra start positionen myList[0] mot de andra i myList[]

CPU: Intel core i5 3450 | GPU: Asus Radeon HD 7870 | PSU: Corsair GS 600W | Moderkort: MSI b75a-g43 | HDD WD blue 500 GB | RAM: Crucial ballistiX 2x4gb DDR3 1600MHz | Ljudkort: Asus Xonar DG |

Trädvy Permalänk
Medlem
Plats
Malmö
Registrerad
Feb 2006

Du skall sätta något i stil med
for(int i = 0; i < myList.length; i++)

Det är längden på listan du jämför med, inte ett särskilt element.

Trädvy Permalänk
Medlem
Registrerad
Apr 2012

Varför använder du inte cord? Cord är variabeln som är saken i listan varje gång den går igenom den.

Annars kan du kanske prova en while loop liknande detta:

i = 0 while i < myList[-1]: // Code i += 1

Du kanske bara vill använda längden av listan, det kan i sådana fall åstadkommas på detta sätt:

for i in range(len(myList)): pass

Chassi: En stor bakpotatis
CPU: En körsbärstomat (OC 4.5 tomater) som kyls av ketchup
Modertkort: En extra-allt pizza
Nätagg: En modulär kålrot
Grafikkort: En fet biff (standardklock 987mHeinz)

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Aug 2008

Funktionerna range och xrange kan skapa listor med integers från t.ex. 0 till längden av din lista. Närmaste (så vitt jag vet) du kan komma en "traditionell" for-loop i Python.

for i in xrange(0, len(myList)): print i

Men om du bara ska jämföra med första indexet funkar den loop du har om du använder myList[0] == cord där cord i det här fallet är myList[n]

Neon
Citera mig om du vill ha svar!

Trädvy Permalänk
Medlem
Plats
Götet, typ
Registrerad
Okt 2004
Skrivet av turbogeten:

Hej, har försökt få till en for loop i python men ser att den fungerar som någon sorts for each. Så finns det något sätt att göra en loop som ser ut ungeför så här i python?

for(int i = 0; i < myList[-1]; i++) { }

Har såhär just nu, men det fungerar inte som jag vill, då jag vill kunna loopa igenom en lista.

for cord in myList: my_distance = gmaps.distance_matrix(myList[0], myList[1:]) travelTime = (my_distance['rows'][0]['elements'][0]['distance']['value']) print my_distance print travelTime

Jag har hämtat ett antal positioner och vill jämföra start positionen myList[0] mot de andra i myList[]

En detalj i det hela. For i python är for each.

/M

Trädvy Permalänk
Medlem
Registrerad
Jun 2012
Skrivet av Killbom:

Du skall sätta något i stil med
for(int i = 0; i < myList.length; i++)

Det är längden på listan du jämför med, inte ett särskilt element.

det är python koden jag behöver hjälp med.

Skrivet av Deatlev:

Varför använder du inte cord? Cord är variabeln som är saken i listan varje gång den går igenom den.

Annars kan du kanske prova en while loop liknande detta:

i = 0 while i < myList[-1]: // Code i += 1

Du kanske bara vill använda längden av listan, det kan i sådana fall åstadkommas på detta sätt:

for i in range(len(myList)): pass

cord fungerar inte med google maps funktionen då den tar strings

Skrivet av Neonxz:

Funktionerna range och xrange kan skapa listor med integers från t.ex. 0 till längden av din lista. Närmaste (så vitt jag vet) du kan komma en "traditionell" for-loop i Python.

for i in xrange(0, len(myList)): print i

Men om du bara ska jämföra med första indexet funkar den loop du har om du använder myList[0] == cord där cord i det här fallet är myList[n]

Tror jag fick din att fungera, bytte ut 0 mot 1 då inte vill jämföra startposition mot startposition. Ska testa runt lite och se om de fungera som tänkt. Tack för hjälpen alla

for i in xrange(0, len(myList)): print i

CPU: Intel core i5 3450 | GPU: Asus Radeon HD 7870 | PSU: Corsair GS 600W | Moderkort: MSI b75a-g43 | HDD WD blue 500 GB | RAM: Crucial ballistiX 2x4gb DDR3 1600MHz | Ljudkort: Asus Xonar DG |

Trädvy Permalänk
Medlem
Registrerad
Jun 2012
Skrivet av Marowak:

En detalj i det hela. For i python är for each.

Jo jag märkte det, så ville ha hjälp att hitta något som efterlikna en for loop sådan som jag skrev.

CPU: Intel core i5 3450 | GPU: Asus Radeon HD 7870 | PSU: Corsair GS 600W | Moderkort: MSI b75a-g43 | HDD WD blue 500 GB | RAM: Crucial ballistiX 2x4gb DDR3 1600MHz | Ljudkort: Asus Xonar DG |

Trädvy Permalänk
Forumledare
Registrerad
Okt 2002

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

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.