Jak uzyskać dostęp do indeksu w for
pętli, jak poniżej?
ints = [8, 23, 45, 12, 78]
for i in ints:
print('item #{} = {}'.format(???, i))
Chcę uzyskać ten wynik:
item #1 = 8
item #2 = 23
item #3 = 45
item #4 = 12
item #5 = 78
Jak przejść przez pętlę za pomocą for
pętli, jak uzyskać dostęp do indeksu pętli, od 1 do 5 w tym przypadku?
Odpowiedzi:
Użycie dodatkowej zmiennej stanu, takiej jak zmienna indeksu (której normalnie używasz w językach takich jak C lub PHP), jest uważane za nie-pytoniczne.
Lepszą opcją jest użycie wbudowanej funkcji
enumerate()
, dostępnej zarówno w Pythonie 2, jak i 3:Sprawdź PEP 279, aby uzyskać więcej.
źródło
enumerate
nie wiąże się to z dodatkowymi kosztami?enumerate
.Użyj,
enumerate
aby uzyskać indeks z elementem podczas iteracji:I zauważ, że indeksy Pythona zaczynają się od zera, więc otrzymałeś 0 do 4 z powyższym. Jeśli chcesz liczyć, od 1 do 5, zrób to:
Przepływ kontrolny Unidiomatic
To, o co prosisz, to Pythoniczny odpowiednik następującego, który jest algorytmem, którego większość programistów języków niższego poziomu użyłaby:
Lub w językach, w których nie ma pętli dla każdego:
lub czasem częściej (ale jednoznacznie) w Pythonie:
Użyj funkcji wyliczenia
enumerate
Funkcja Pythona redukuje bałagan wizualny, ukrywając rozliczanie indeksów i zamykając iterowalny w innym iterowalnym (enumerate
obiekcie), który daje krotkę indeksu z dwoma pozycjami i element, który zapewni pierwotna iterowalna. To wygląda tak:Ten przykład kodu jest dość dobrym kanonicznym przykładem różnicy między kodem, który jest idiomatyczny dla Pythona, a kodem, który nie jest. Kod idiomatyczny jest wyrafinowanym (ale nie skomplikowanym) Pythonem, napisanym w sposób, w jaki był przeznaczony do użycia. Kod idiomatyczny oczekuje od projektantów języka, co oznacza, że zwykle ten kod jest nie tylko bardziej czytelny, ale także bardziej wydajny.
Uzyskiwanie rachunków
Nawet jeśli nie potrzebujesz indeksów na bieżąco, ale potrzebujesz liczby iteracji (czasem pożądanej), od której możesz zacząć,
1
a ostateczna liczba będzie twoją liczbą.Liczba wydaje się być bardziej, o co chcesz zapytać (w przeciwieństwie do indeksu), gdy powiedziałeś, że chcesz od 1 do 5.
Podział - wyjaśnienie krok po kroku
Aby rozbić te przykłady, powiedzmy, że mamy listę elementów, które chcemy iterować za pomocą indeksu:
Teraz przekazujemy iterowalną wartość do wyliczenia, tworząc obiekt wyliczeniowy:
Możemy wyciągnąć pierwszy element z iteracji, który dostalibyśmy w pętli z
next
funkcją:Widzimy, że otrzymujemy krotkę
0
pierwszego indeksu i'a'
pierwszego elementu:możemy użyć tak zwanego „ rozpakowywania sekwencji ”, aby wyodrębnić elementy z tej dwu-krotki:
a kiedy sprawdzać
index
, uważamy, że odnosi się do pierwszego indeksu, 0, iitem
odnosi się do pierwszego elementu,'a'
.Wniosek
Więc zrób to:
źródło
items
jest pusty?[1406, 1409]
. Jeśli drukuję na konsoli za pomocąprint(legData)
, dane wyjściowe wynoszą [1406,1409] . Jeśli jednak spróbuję parsować poszczególne wartości z listyfor idx, xLeg in enumerate(legData):
print(idx, xLeg)
, otrzymam dane wyjściowe z poszczególnych liczb całkowitych, takich jak [, 1, 4, 0, 6 itd., Względem indeksów 0, 1, 2, 3, 4 itd. (tak, nawiasy kwadratowe i przecinek są również wyprowadzane, jakby były częścią samych danych ). Co tu idzie nie tak?Uruchomienie go jest dość proste
1
niż0
:Uwaga
Ważna wskazówka, choć trochę myląca, ponieważ
index
będzietuple
(idx, item)
tutaj. Dobrze iść.źródło
index, item
just,index
jest bardzo mylące, jak zauważyłeś. Po prostu użyjfor index, item in enumerate(ints)
.źródło
xrange
w wersji wcześniejszej niż 3.0.enumerate
zapisuje jakąkolwiek logikę; nadal musisz wybrać obiekt, który chcesz indeksowaći
, nie?Jak jest normą w Pythonie, jest na to kilka sposobów. We wszystkich przykładach założono:
lst = [1, 2, 3, 4, 5]
1. Korzystanie z wyliczenia ( uważane za najbardziej idiomatyczne )
Moim zdaniem jest to również najbezpieczniejsza opcja, ponieważ wyeliminowano szansę na nieskończoną rekurencję. Zarówno element, jak i jego indeks są przechowywane w zmiennych i nie ma potrzeby pisania dalszego kodu, aby uzyskać dostęp do elementu.
2. Tworzenie zmiennej do przechowywania indeksu ( przy użyciu
for
)3. Tworzenie zmiennej do przechowywania indeksu ( użycie
while
)4. Zawsze jest inny sposób
Jak wyjaśniono wcześniej, istnieją inne sposoby, aby to zrobić, które nie zostały tu wyjaśnione, a mogą nawet zastosować więcej w innych sytuacjach. np. używając
itertools.chain
z. Obsługuje zagnieżdżone pętle lepiej niż inne przykłady.źródło
Po staremu:
Zrozumienie listy:
źródło
Najszybszym sposobem na uzyskanie dostępu do indeksów list w pętli w Pythonie 2.7 jest użycie metody range dla małych list i metody wyliczania dla list średnich i dużych.
Zapoznaj się z różnymi podejściami, które można zastosować do iteracji listy i dostępu do wartości indeksu oraz ich wskaźników wydajności (które, jak sądzę, byłyby dla Ciebie przydatne) w przykładach kodu poniżej:
Zobacz wskaźniki wydajności dla każdej metody poniżej:
W rezultacie użycie
range
metody jest najszybszą do listy z 1000 pozycji. Do listy o rozmiarze> 10 000 pozycjienumerate
Zwycięzcą jest .Dodając kilka przydatnych linków poniżej:
Jaka jest różnica między funkcjami zasięgu i zakresu x w Pythonie 2.X?
Co jest szybsze dla pętli używającej wyliczenia lub dla pętli używającej xrange w Pythonie?
range (len (list)) czy enumerate (list)?
źródło
Po pierwsze, indeksy będą wynosić od 0 do 4. Języki programowania zaczną liczyć od 0; nie zapomnij o tym, bo znajdziesz wyjątek poza zakresem. Wszystko, czego potrzebujesz w pętli for, to zmienna zliczająca od 0 do 4, taka jak:
Pamiętaj, że napisałem od 0 do 5, ponieważ pętla zatrzymuje jedną liczbę przed maksimum. :)
Aby uzyskać wartość indeksu użyj
źródło
Oto, co dostajesz, gdy uzyskujesz dostęp do indeksu w
for
pętlach:Wynik:
Wynik:
Wynik:
źródło
Zgodnie z tą dyskusją: http://bytes.com/topic/python/answers/464012-objects-list-index
Przeciwdziałanie iteracji pętli
Bieżący idiom pętli nad indeksami wykorzystuje wbudowaną
range
funkcję:Pętlę zarówno nad elementami, jak i indeksami można uzyskać za pomocą starego idiomu lub za pomocą nowej
zip
wbudowanej funkcji:lub
przez http://www.python.org/dev/peps/pep-0212/
źródło
Możesz to zrobić za pomocą tego kodu:
Użyj tego kodu, jeśli chcesz zresetować wartość indeksu na końcu pętli:
źródło
Najlepszym rozwiązaniem tego problemu jest użycie wbudowanej funkcji python w wyliczeniu .
wyliczyć zwracaną krotkę
pierwsza wartość to indeks
druga wartość to element tablicy o tym indeksie
źródło
W swoim pytaniu piszesz „jak uzyskać dostęp do indeksu pętli, w tym przypadku od 1 do 5?”
Jednak indeks listy zaczyna się od zera. Tak więc musimy wiedzieć, czy tak naprawdę potrzebujesz indeksu i elementu dla każdego elementu na liście, czy też naprawdę chcesz liczb zaczynających się od 1. Na szczęście w Pythonie łatwo jest wykonać jedno lub oba.
Po pierwsze, dla wyjaśnienia,
enumerate
funkcja iteracyjnie zwraca indeks i odpowiedni element dla każdego elementu na liście.Wynik dla powyższego jest wtedy,
Zauważ, że indeks zaczyna się od 0. Ten rodzaj indeksowania jest powszechny wśród współczesnych języków programowania, w tym Python i C.
Jeśli chcesz, aby twoja pętla obejmowała część listy, możesz użyć standardowej składni Pythona dla części listy. Na przykład, aby przejść od drugiego elementu na liście do ostatniego elementu, ale nie włączając go, możesz użyć
Zauważ, że po raz kolejny indeks wyjściowy zaczyna się od 0,
To prowadzi nas do
start=n
zmianyenumerate()
. To po prostu równoważy indeks, możesz w równoważny sposób po prostu dodać liczbę do indeksu wewnątrz pętli.dla którego wyjście jest
źródło
Gdybym miał wykonać iterację
nums = [1, 2, 3, 4, 5]
, zrobiłbym toLub uzyskaj długość jako
l = len(nums)
źródło
Jeśli na liście nie ma zduplikowanej wartości:
źródło
enumerate
. Powinieneś usunąć tę odpowiedź.Możesz także spróbować tego:
Dane wyjściowe to
źródło
Możesz użyć tej
index
metodyEDYCJA Podkreślone w komentarzu, że ta metoda nie działa, jeśli istnieją duplikaty
ints
, poniższa metoda powinna działać dla wszystkich wartości wints
:Lub alternatywnie
jeśli chcesz uzyskać zarówno indeks, jak i wartość
ints
jako listę krotek.Używa metody
enumerate
wybranej w odpowiedzi na to pytanie, ale ze zrozumieniem listy, dzięki czemu jest szybsza z mniejszym kodem.źródło
Prosta odpowiedź przy użyciu While Loop:
Wynik:
źródło
Aby wydrukować krotkę (indeksu, wartości) w rozumieniu listy za pomocą
for
pętli:Wynik:
źródło
Służy to celowi wystarczająco dobrze:
źródło
index()
będą szukać pierwszego wystąpieniax
, nie wspominając o czasie O ( n ^ 2 ) wymaganym do wyszukania każdego elementu.