Lặp lại một danh sách với các chỉ mục trong Python


203

Tôi có thể thề rằng tôi đã thấy hàm (hoặc phương thức) có một danh sách, như thế này [3, 7, 19]và biến nó thành danh sách lặp lại của các bộ dữ liệu, như vậy: [(0,3), (1,7), (2,19)]sử dụng nó thay vì:

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

nhưng tôi không thể nhớ tên và googling "danh sách lặp" không có gì.

Câu trả lời:


354
>>> a = [3,4,5,6]
>>> for i, val in enumerate(a):
...     print i, val
...
0 3
1 4
2 5
3 6
>>>

107

Đúng, đó sẽ là enumeratechức năng! Hoặc hơn thế nữa, bạn cần phải làm:

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

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

2
đôi khi mọi người hỏi một câu hỏi liên quan đến câu hỏi mà họ thực sự muốn, đôi khi, họ hơi bừa bãi về ý nghĩa của "tốt nhất".
msw

3
Và đôi khi mọi người chỉ đọc một dòng rưỡi đầu tiên của câu hỏi thay vì toàn bộ câu hỏi. Nếu bạn đi đến cuối dòng thứ hai, anh ta nói rằng anh ta muốn sử dụng nó thay vì for i in range(len(name_of_list)):đó là điều khiến tôi đưa ra một ví dụ bằng cách sử dụng thay cho những gì được hiển thị trong phần đầu tiên.
Vinko Vrsalovic

1
@HumphreyBogart Bởi vì Lauren Bacall thích dài dòng hơn.
javadba

25

Đây là một cái khác sử dụng zipchức năng.

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

10
enumerate()thanh lịch hơn một chút, tôi nghĩ vậy.
Nathan Fellman

14
@Nathan: Nhưng zip () chung chung hơn và hoạt động cho các cặp danh sách tùy ý, vì vậy thật tốt khi biết.
ShreevatsaR

8

Đây là một giải pháp sử dụng chức năng bản đồ:

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

Và một giải pháp sử dụng danh sách hiểu:

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

5

enumeratechức năng python sẽ được đáp ứng yêu cầu của bạn

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

đầu ra

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

2

Nếu bạn có nhiều danh sách, bạn có thể thực hiện kết hợp này enumeratezip:

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)
Đầu ra:
0 1 10 100
1 2 20 200
2 3 30 300
3 4 40 400
4 5 50 500

Lưu ý rằng dấu ngoặc đơn là bắt buộc sau i. Nếu không, bạn nhận được lỗi:ValueError: need more than 2 values to unpack

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.