Multiple IF conditions in a python list comprehension Multiple IF conditions in a python list comprehension python python

Multiple IF conditions in a python list comprehension


How about

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

For example, if n = 30 this is

[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: Here's how you could apply a list of conditions:

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 iar = map(apply_conditions, range(0, n))


You can put you logic in a separate function, and then have the elegance of the list comprehension along with the readability of the function:

def cond(i):    if i % 4 == 0: return 'four'    elif i % 6 == 0: return 'six'        return il=[cond(i) for i in range(1,n)]

If you have lots of conditions, it is usually easier to maintain a single dict rather than a big if/else ladder:

def cond(i):    mkey={4:'four',6:'six'}    return next((mkey[k] for k in mkey if i%k == 0), i)

This uses the default version of next to find if any integer key is a multiple of that key or the number itself, the default, if not.

Which could be a single comprehension if desired:

[next((v for k,v in {4:'four',6:'six'}.items() if i%k==0), i) for i  in range(1,10)]


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