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?
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.
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 .
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).
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))
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)]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With