2013-08-08 27 views
6

phép nói rằng tôi có một danh sách của tuples như saupython - iterating trên một tập hợp con của một danh sách các hàng

l = [(4,1), (5,1), (3,2), (7,1), (6,0)] 

Tôi muốn để lặp qua các mục mà yếu tố thứ 2 trong tuple là 1 ?

Tôi có thể làm điều đó bằng cách sử dụng điều kiện if trong vòng lặp, nhưng tôi đã hy vọng sẽ có một amore pythonic cách thực hiện?

Cảm ơn

+0

Hmm, lưu ý để tự: không bao giờ sử dụng ' l' (ell) làm biểu tượng. Tương tự như vậy 'O' (Oh). –

Trả lời

6

Bạn có thể sử dụng danh sách hiểu:

[ x for x in l if x[1] == 1 ] 

Bạn cũng có thể lặp qua các bộ dữ liệu bằng cách sử dụng cú pháp trình tạo:

for tup in (x for x in l if x[1] == 1): 
    ... 
+3

Genexp đó ít dễ đọc hơn câu lệnh 'if' tương đương. Điều này có vẻ như một ý tưởng tồi. – user2357112

3

Làm thế nào về

ones = [(x, y) for x, y in l if y == 1] 

hoặc

ones = filter(lambda x: x[1] == 1, l) 
1

Hãy thử điều này, sử dụng list comprehensions là cách pythonic để giải quyết vấn đề:

lst = [(4,1), (5,1), (3,2), (7,1), (6,0)] 
[(x, y) for x, y in lst if y == 1] 
=> [(4, 1), (5, 1), (7, 1)] 

Chú ý cách chúng tôi sử dụng giải nén tuple x, y để lấy từng phần tử trong cặp và cách điều kiện if y == 1 lọc ra chỉ những phần tử có giá trị 1 trong phần tử thứ hai của cặp. Sau đó, bạn có thể làm bất cứ điều gì bạn muốn với các yếu tố được tìm thấy, trong đó, tôi đang xây dựng lại cặp ban đầu trong phần này ở bên trái: (x, y)

3

Chỉ cần sử dụng if. Nó rõ ràng và đơn giản.

for x, y in tuples: 
    if y == 1: 
     do_whatever_with(x) 
+1

* "Tôi có thể làm điều đó bằng cách sử dụng một điều kiện nếu trong vòng lặp, nhưng tôi đã hy vọng sẽ có một cách amore pythonic làm việc đó?" * – arshajii

+1

Điều này * là * cách Pythonic để làm điều đó. Máy phát điện và danh sách hiểu là tốt cho mục đích dự định của họ, nhưng nếu bạn thực sự muốn lặp qua một cái gì đó hơn là xây dựng một iterable, đây là con đường để đi. Bạn có thể thực sự yêu cầu looping trên một genexp là dễ đọc hơn? – user2357112

2

Xây dựng một máy phát điện trên nó:

has_1 = (tup for tup in l if l[1] == 1) 
for item in has_1: 
    pass 
1

Vì bạn muốn lặp, itertools.ifilter là một giải pháp tốt đẹp:

from itertools import ifilter 
iter = ifilter(lambda x: x[1] == 1, l) 
for item in iter: 
    pass 
+0

Đây không phải là một giải pháp tuyệt vời mà bài kiểm tra có thể được nắm bắt một cách thuận tiện trong mệnh đề 'if'. – Marcin

2
for e in filter(l, lambda x: x[1] == 1): 
    print e 
Các vấn đề liên quan