Ітерацію списку з індексами в Python


203

Я міг би поклястись, що бачив функцію (або метод), який бере такий список, як цей [3, 7, 19]і перетворює його в ітерабельний список кортежів, як-от так: [(0,3), (1,7), (2,19)]використовувати його замість:

for i in range(len(name_of_list)):
    name_of_list[i] = something

але я не можу пригадати ім'я, і ​​гугл "ітераційний список" не отримує нічого.

Відповіді:



107

Так, це була б enumerateфункція! Або ще більше, що вам потрібно зробити:

list(enumerate([3,7,19]))

[(0, 3), (1, 7), (2, 19)]

2
інколи люди задають питання, пов’язані з тим, кого вони справді хочуть, в інший час вони дещо нерозбірливі щодо того, що означає «найкраще».
msw

3
І іноді люди читають лише перші півтора рядки запитання замість цілого питання. Якщо ви дістаєтеся до кінця другого рядка, він каже, що хоче використовувати його, а for i in range(len(name_of_list)):не те, що призвело до того, щоб я наводив приклад, використовуючи для, а не те, що було показано в першій частині.
Вінко Врсалович

1
@HumphreyBogart Тому що Лорен Бакал любить бути більш багатослівним.
javadba

25

Ось ще одне використання zipфункції.

>>> a = [3, 7, 19]
>>> zip(range(len(a)), a)
[(0, 3), (1, 7), (2, 19)]

10
enumerate()трохи елегантніше, я думаю.
Натан Фелман

14
@Nathan: Але zip () є більш загальним і працює для довільних пар списків, тому це добре знати.
ShreevatsaR

8

Ось це рішення за допомогою функції карти:

>>> a = [3, 7, 19]
>>> map(lambda x: (x, a[x]), range(len(a)))
[(0, 3), (1, 7), (2, 19)]

І рішення з використанням розуміння списку:

>>> a = [3,7,19]
>>> [(x, a[x]) for x in range(len(a))]
[(0, 3), (1, 7), (2, 19)]

5

enumerateфункція python буде задоволена вашим вимогам

result = list(enumerate([1,3,7,12]))
print result

вихід

[(0, 1), (1, 3), (2, 7),(3,12)]

2

Якщо у вас є кілька списків, ви можете це комбінувати enumerateі zip:

list1 = [1, 2, 3, 4, 5]
list2 = [10, 20, 30, 40, 50]
list3 = [100, 200, 300, 400, 500]
for i, (l1, l2, l3) in enumerate(zip(list1, list2, list3)):
    print(i, l1, l2, l3)
Вихід:
0 1 10 100
1 2 20 200
2 3 30 300
3 4 40 400
4 5 50 500

Зауважте, що дужки потрібні після i. Інакше ви отримаєте помилку:ValueError: need more than 2 values to unpack

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.