Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Multiple IF conditions in a python list comprehension

Tags:

I was wondering, is it possible to put multiple if conditions in a list comprehension? I didn't find anything like this in the docs.

I want to be able to do something like this

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) 

using a list comprehension. How can I do it?

Is this even possible? If its not, what would be the most elegant (pythonic) way to accomplish this?

like image 824
Rushil Paul Avatar asked Apr 22 '12 22:04

Rushil Paul


People also ask

Can you use an if statement in list comprehension Python?

if..else in List Comprehension in Python. You can also use an if-else in a list comprehension in Python. Since in a comprehension, the first thing we specify is the value to put in a list, this is where we put our if-else. This code stores in a list, for each integer from 0 to 7, whether it is even or odd.

Can you have multiple conditions in an if statement Python?

Python supports multiple independent conditions in the same if block. Say you want to test for one condition first, but if that one isn't true, there's another one that you want to test. Then, if neither is true, you want the program to do something else. There's no good way to do that using just if and else .

Can you have 3 conditions in an if statement Python?

Test multiple conditions with a single Python if statementTo test multiple conditions in an if or elif clause we use so-called logical operators. These operators combine several true/false values into a final True or False outcome (Sweigart, 2015).


2 Answers

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 i  ar = map(apply_conditions, range(0, n)) 
like image 130
David Robinson Avatar answered Sep 28 '22 13:09

David Robinson


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 i  l=[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)] 
like image 37
dawg Avatar answered Sep 28 '22 11:09

dawg