2012-04-03 31 views
61

Chúng tôi có thể sử dụng elif trong danh sách hiểu không?`elif` trong điều kiện hiểu danh sách

Ví dụ:

l = [1, 2, 3, 4, 5] 

for values in l: 
    if values==1: 
     print 'yes' 
    elif values==2: 
     print 'no' 
    else: 
     print 'idle' 

Chúng ta có thể bao gồm các elif trong danh sách hiểu biết của chúng tôi, trong một thời trang tương tự như đoạn mã trên?

Ví dụ, một câu trả lời như:

['yes', 'no', 'idle', 'idle', 'idle'] 

Cho đến bây giờ, tôi đã chỉ được sử dụng ifelse trong danh sách hiểu.

Trả lời

132

Python của conditional expressions được thiết kế chính xác cho loại use-case:

>>> l = [1, 2, 3, 4, 5] 
>>> ['yes' if v == 1 else 'no' if v == 2 else 'idle' for v in l] 
['yes', 'no', 'idle', 'idle', 'idle'] 

Hope this helps :-)

+8

tôi thích cách thức các chuỗi lại với nhau – jamylak

+1

Có một số interesti ng lịch sử trong cú pháp. Trong nhiều năm trước khi giới thiệu của họ "biểu thức đại học" là một trong năm thay đổi được yêu cầu nhiều nhất trong ngôn ngữ. Vì Guido van Rossum đã thiết kế rõ ràng nó như một ngôn ngữ dựa trên tuyên bố, ông đã kiên quyết chống cự trong một thời gian dài (các biểu thức đại học, và đặc biệt là sự lạm dụng của họ, là những nguồn tối tăm trong mã). Khi anh cuối cùng cũng không chịu nổi, anh tuyên bố anh đã chọn một cú pháp không khuyến khích lạm dụng. Như thường lệ, anh ta đã làm một công việc thiết kế trang nhã. – holdenweb

+1

Ternary, dammit (ông viết, nhận thấy sai lầm khó hiểu của mình quá muộn để chỉnh sửa). – holdenweb

41
>>> d = {1: 'yes', 2: 'no'} 
>>> [d.get(x, 'idle') for x in l] 
['yes', 'no', 'idle', 'idle', 'idle'] 
+4

Tôi nghĩ rằng biểu mẫu này dễ tiêu hóa hơn là cố gắng thực hiện một logic if/else dài và phức tạp trong danh sách comp – jdi

+5

@ jdi Mặc dù các biểu thức có điều kiện có thể không phù hợp với khẩu vị của bạn nhưng chúng * được thiết kế đặc biệt để xử lý các chuỗi if-elif-elif-else, giống như OP được yêu cầu. Chúng không khó học và có thể xử lý một cách duyên dáng các tình huống không tuân theo logic tra cứu từ điển: '' 'A' nếu lớp> = 90 else 'B' nếu lớp> = 80 else 'C' nếu lớp> = 70 khác 'F'''. –

+0

Nếu có một lợi thế của việc xác định 'd' bên ngoài hiểu? –

1

Bạn có thể sử dụng danh sách hiểu được bạn đang đi để tạo ra một danh sách khác từ bản gốc.

>>> l = [1, 2, 3, 4, 5] 
>>> result_map = {1: 'yes', 2: 'no'} 
>>> [result_map[x] if x in result_map else 'idle' for x in l] 
['yes', 'no', 'idle', 'idle', 'idle'] 
13

Bạn có thể, sắp xếp.

Lưu ý rằng khi bạn sử dụng sytax như:

['yes' if v == 1 else 'no' for v in l] 

Bạn đang sử dụng hình thức ternary của nếu điều hành/else (nếu bạn đã quen thuộc với các ngôn ngữ như C, điều này cũng giống như ?: xây dựng: (v == 1 ? 'yes' : 'no')).

Dạng ternary của if/else điều hành không có một 'elif' được xây dựng trong, nhưng bạn có thể mô phỏng nó trong 'khác' điều kiện:

['yes' if v == 1 else 'no' if v == 2 else 'idle' for v in l] 

này cũng giống như nói:

for v in l: 
    if v == 1 : 
     print 'yes' 
    else: 
     if v == 2: 
      print 'no' 
     else: 
      print 'idle' 

Vì vậy, không có cấu trúc 'elif' trực tiếp như bạn đã hỏi, nhưng nó có thể được mô phỏng bằng câu lệnh if/else lồng nhau.

1

Một cách dễ dàng là sử dụng danh sách hiểu có điều kiện như thế này:

l=[1,2,3,4,5] 
print [[["no","yes"][v==1],"idle"][v!=1 and v!=2] for v in l] 

mang đến cho bạn anwer đúng:

[ 'có', 'không', 'nhàn rỗi', 'nhàn rỗi', 'nhàn rỗi']

0

Có lẽ bạn muốn điều này:

l = [1, 2, 3, 4, 5] 

print ([['idle','no','yes'][2*(n==1)+(n==2)] for n in l]) 
Các vấn đề liên quan