2013-02-13 13 views
48

xem xét các mã Python sau mà tôi thêm vào một List2 mới tất cả các mục có chỉ số 1-3 của list1:là hiểu danh sách Python với quyền truy cập vào chỉ mục/liệt kê có thể không?

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

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

cái gì đó như:

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

nhưng kể từ khi tôi không có số 'ind', sẽ làm việc này? :

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ể chỉ cần cắt 'list1 [1: 4]' tại đây – wim

+0

bạn có nghĩa là tôi có thể cắt danh sách bên trong danh sách hiểu? như: '[x cho x trong danh sách1 [1: 4]]'? –

+0

@PavAmetvic, không @wim nghĩa là bạn chỉ có thể viết 'list2 = list1 [1: 4]' –

Trả lời

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

+1 để trả lời 30 giây trước BrenBarn và vì bạn đã theo các khuyến nghị PEP8 (http://www.python.org/dev/ peps/pep-0008/# khoảng trắng-trong-biểu thức và câu lệnh) :) – furins

24

Nếu bạn sử dụng enumerate, bạn làm có quyền truy cập vào các chỉ số:

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

+1 để dành 30 giây để giải thích câu trả lời của bạn :) – furins

1

Trừ trường hợp sử dụng thực sự của bạn là phức tạp hơn, bạn nên chỉ cần sử dụng một lát danh sách như được đề xuất bởi @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ỉ số - đó là rõ ràng hơn để lặp qua một lát hay một islice

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

hoặc

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

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

+0

cảm ơn nhưng vì tôi muốn thực hiện thao tác trên 'x' bên trong hiểu (cho phép nói 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 slice bên trong danh sách hiểu là cách tốt nhất! cảm ơn –

+0

@PavAmetvic, ok những trường hợp đó vẫn đủ đơn giản để không cần đếm –

Các vấn đề liên quan