2012-04-22 8 views
14

Мне было интересно, можно ли положить несколько условий if в понимание списка? Я не нашел ничего подобного в документах.Множественные условия IF в понимании списка python

Я хочу быть в состоянии сделать что-то вроде этого

ar=[] 
for i in range(1,n): 
    if i%4 == 0: ar.append('four') 
    elif i%6 == 0: ar.append('six') 
    else: ar.append(i) 

, используя список понимание. Как мне это сделать?

Возможно ли это? Если это не так, какой был бы самый элегантный (питонический) способ сделать это?

+1

Просто потому, что вы можете ... – dkamins

ответ

16

Как насчет

ar = [('four' if i % 4 == 0 else ('six' if i % 6 == 0 else i)) for i in range(1, n)] 

Например, если n = 30 это

[1, 2, 3, 'four', 5, 'six', 7, 'four', 9, 10, 11, 'four', 13, 14, 15, 'four', 17, 'six', 19, 'four', 21, 22, 23, 'four', 25, 26, 27, 'four', 29] 

ETA: Вот как вы могли бы применить список условий:

CONDITIONS = [(lambda i: i % 4 == 0, "four"), (lambda i: i % 6 == 0, "six"), 
       (lambda i: i % 7 == 0, "seven")] 

def apply_conditions(i): 
    for condition, replacement in CONDITIONS: 
     if condition(i): 
      return replacement 
    return i 

ar = map(apply_conditions, range(0, n)) 
+2

Спасибо! Я верю, что могу добавить к нему любое количество условий. Хотя код будет непостижим! – Rushil

+0

См. Мое редактирование. Я уверен, что вы можете выяснить остаток (но если нет, я могу помочь) –

+0

(Мое первоначальное пренебрежение, чтобы сделать их лямбда-операторами, текущая версия будет работать) –

5

Вы можете поставить вас логики в отдельной функции, а затем иметь элегантность понимания списка вместе с остроумием h читаемость функции:

def cond(i): 
    if i % 4 == 0: return 'four' 
    elif i % 6 == 0: return 'six' 

    return i 

l=[cond(i) for i in range(1,n)] 
Смежные вопросы