Trong Python, có thể truy cập vào chỉ mục mục không?


91

Hãy xem xét mã Python sau đây mà tôi thêm mới list2tất cả các mục có chỉ số từ 1 đến 3 trong số list1:

for ind, obj in enumerate(list1):
    if 4 > ind > 0:
        list2.append(obj)

Làm thế nào bạn sẽ viết điều này bằng cách sử dụng khả năng hiểu danh sách, nếu tôi không có quyền truy cập vào các chỉ mục thông qua liệt kê?

cái gì đó như:

list2 = [x for x in list1 if 4 > ind > 0]

nhưng vì tôi không có indsố, điều này có hoạt động không?

list2 = [x for x in enumerate(list1) if 4 > ind > 0]

3
Tôi đoán trường hợp sử dụng thực tế của bạn phức tạp hơn, nhưng bạn có thể đơn giản là cắt list1[1:4]ở đây
wim

bạn có nghĩa là như tôi có thể cắt danh sách bên trong danh sách hiểu? như [x for x in list1[1:4]]:?
Pav Ametvic

@PavAmetvic, không có @wim nghĩa là bạn chỉ có thể viếtlist2 = list1[1:4]
John La Rooy

Câu trả lời:



37

Nếu bạn sử dụng enumerate, bạn có làm được tiếp cận với các chỉ số:

list2 = [x for ind, x in enumerate(list1) if 4>ind>0]

10

Trừ khi trường hợp sử dụng thực của bạn phức tạp hơn, bạn chỉ nên sử dụng một lát danh sách theo đề xuất của @wim

>>> list1 = ['zero', 'one', 'two', 'three', 'four', 'five', 'six']
>>> [x for ind, x in enumerate(list1) if 4 > ind > 0]
['one', 'two', 'three']
>>> list1[1:4]
['one', 'two', 'three']

Đối với các trường hợp phức tạp hơn - nếu bạn không thực sự cần chỉ mục - thì việc lặp lại một lát hoặc một islice sẽ rõ ràng hơn

list2 = [x*2 for x in list1[1:4]]

hoặc là

from itertools import islice
list2 = [x*2 for x in islice(list1, 1, 4)]

Đối với các lát nhỏ, đơn giản list1[1:4]. Nếu các lát có thể trở nên khá lớn, tốt hơn nên sử dụng islice để tránh sao chép bộ nhớ


cảm ơn nhưng vì tôi muốn thực hiện một phép toán trên 'x' bên trong phần hiểu (giả sử x * x) trước khi tôi lưu trữ nó bên trong danh sách mới, có vẻ như sử dụng lát cắt bên trong phần hiểu danh sách là cách tốt nhất! cảm ơn
Pav Ametvic 14/02/13

@PavAmetvic, ok, những trường hợp đó vẫn đủ đơn giản để không cần liệt kê
John La Rooy 14/02/13
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.