2012-10-20 26 views

Trả lời

37

Bạn có thể kết hợp các vòng lặp với một generator expression:

for x in (y for y in items if y > 10): 
    .... 

itertools.ifilter là một tùy chọn khác - và thậm chí là một tùy chọn thích hợp hơn khi hiệu quả quan trọng, ví dụ: trên một tập dữ liệu lớn.

+4

Đây là cách đúng để thực hiện vì không có mảng trung gian nào được tạo ra. Điều này được gọi là biểu thức máy phát. IMO đáng tiếc của nó bạn không thể chỉ viết ngắn hơn 'cho x trong các mặt hàng nếu x> 10:' mặc dù. –

+0

@MichaelAnderson: vâng, điều đó sẽ gọn gàng.Cú pháp này được cho là đã bị Guido từ chối, nhưng tôi vẫn chưa tìm được bằng chứng. – georg

7

Bạn có nghĩa là một cái gì đó như thế này: -

item_list = [item for item in items if item > 3] 

Hoặc, bạn có thể sử dụng Generator ngôn luận, rằng sẽ không tạo ra một danh sách mới, thay vì trả về một máy phát điện, sau đó trả về phần tử tiếp theo trên mỗi lần lặp sử dụng yield phương pháp: -

for item in (item for item in items if item > 3): 
    # Do your task 
+0

@Downvoter .. Tại sao lại là một lưu ý? Có thể bình luận downvoter? –

+0

Điều này là sai .. –

+0

@ J.F.Sebastian Ah xin lỗi, nên có 'if' sau khi cho. –

2

Không có một cú pháp đặc biệt như where trong câu hỏi của bạn, nhưng bạn có thể luôn luôn chỉ cần sử dụng một tuyên bố if trong for vòng lặp của bạn, như bạn sẽ trong bất kỳ ngôn ngữ khác:

for item in items: 
    if item > 3: 
     # Your logic here 

hoặc một người bảo vệ mệnh đề (một lần nữa, giống như bất kỳ ngôn ngữ nào khác):

for item in items: 
    if not (item > 3): continue 

    # Your logic here 

Cả hai cách tiếp cận nhàm chán này gần như gọn gàng và dễ đọc như một cú pháp đặc biệt cho điều này.

+0

Giải pháp được đánh giá cao nhất với biểu thức máy phát điện hoạt động hiệu quả hơn và cho biết chính xác danh sách chứa trên dòng của biểu thức. – Neil

+0

@Neil Tôi không nghĩ rằng điều này bảo đảm một downvote. Cho dù "chức năng hơn" là một điều tốt là một câu hỏi về hương vị. Cách tiếp cận này sử dụng một dòng mã bổ sung, có vẻ như tiết lộ trong một số trường hợp; bộ tạo dòng một dòng nhồi nhét biểu thức cho chuỗi đầu tiên và biểu thức vị ngữ trên một dòng (và giới thiệu thêm 'cho x trong' bên cạnh) có thể đang cố nhồi nhét quá nhiều vào một dòng nếu biểu thức trình tự và biểu thức vị ngữ là Dài. Cách tiếp cận máy phát điện cũng sử dụng một tính năng ngôn ngữ người mới có thể không quen thuộc. Điều tốt nhất phụ thuộc vào ngữ cảnh và đối tượng. –

2

Bạn có thể sử dụng một rõ ràng if tuyên bố:

for item in items: 
    if item > 3: 
     # ... 

Hoặc bạn có thể tạo ra một máy phát điện nếu bạn cần một cái tên để lặp sau, example:

filtered_items = (n for n in items if n > 3) 

Hoặc bạn có thể vượt qua nó để một chức năng:

total = sum(n for n in items if n > 3) 

Nó có thể là vấn đề của hương vị nhưng tôi f ind cho một vòng lặp kết hợp với genexpr nội tuyến như for x in (y for y in items if y > 3): để được xấu xí so với các tùy chọn ở trên.

0

Python 3 và Python 2.7 đều có filter() chức năng cho phép trích xuất các mặt hàng ra khỏi một danh sách mà một hàm (trong ví dụ dưới đây, đó là chức năng lambda) trả True:

>>> nums=[1,2,3,4,5,6,7,8] 
>>> for item in filter(lambda x: x>5,nums): 
...  print(item) 
... 
6 
7 
8 

chức năng Bỏ trong filter() sẽ chỉ trích xuất các mục là True, như đã nêu trong pydoc filter

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