Home » Python » Putting an if-elif-else statement on one line?

# Putting an if-elif-else statement on one line?

Questions:

Does Python have a ternary conditional operator? (the question is about condensing if-else statement to one line)

Is there an easier way of writing an if-elif-else statement so it fits on one line?
For example,

``````if expression1:
statement1
elif expression2:
statement2
else:
statement3
``````

[UPDATE]

``````if i>100:
x=2
elif i<100:
x=1
else:
x=0
``````

I just feel if the example above could be written the following way, it could look like more concise.

``````x=2 if i>100 elif i<100 1 else 0 [WRONG]
``````

No, it’s not possible (at least not with arbitrary statements), nor is it desirable. Fitting everything on one line would most likely violate PEP-8 where it is mandated that lines should not exceed 80 characters in length.

It’s also against the Zen of Python: “Readability counts”. (Type `import this` at the Python prompt to read the whole thing).

You can use a ternary expression in Python, but only for expressions, not for statements:

``````>>> a = "Hello" if foo() else "Goodbye"
``````

Edit:

Your revised question now shows that the three statements are identical except for the value being assigned. In that case, a chained ternary operator does work, but I still think that it’s less readable:

``````>>> i=100
>>> a = 1 if i<100 else 2 if i>100 else 0
>>> a
0
>>> i=101
>>> a = 1 if i<100 else 2 if i>100 else 0
>>> a
2
>>> i=99
>>> a = 1 if i<100 else 2 if i>100 else 0
>>> a
1
``````

Questions:

If you only need different expressions for different cases then this may work for you:

``````expr1 if condition1 else expr2 if condition2 else expr
``````

For example:

``````a = "neg" if b<0 else "pos" if b>0 else "zero"
``````

Questions:

Just nest another if clause in the else statement. But that doesn’t make it look any prettier.

``````>>> x=5
>>> x if x>0 else ("zero" if x==0 else "invalid value")
5
>>> x = 0
>>> x if x>0 else ("zero" if x==0 else "invalid value")
'zero'
>>> x = -1
>>> x if x>0 else ("zero" if x==0 else "invalid value")
'invalid value'
``````

Questions:

It also depends on teh nature of your expressions. The general advice on the other answers of “not doing it” is quite valid for generic statements and generic expressions.

But if all you need is a “dispacth” table, like, calling a different function depending on the value of a given option, you can put the functions to call inside a dictionary.

Something like:

``````def save():
...
def edit():
...
options = {"save": save, "edit": edit, "remove": lambda : "Not Implemented"}

option = get_input()
result = options[option]()
``````

``````if option=="save":
save()
...
``````

)

Questions:

There’s an alternative that’s quite unreadable in my opinion but I’ll share anyway just as a curiosity:

``````x = (i>100 and 2) or (i<100 and 1) or 0
``````

Questions:

Well, I came across similar problems months ago, then one day I realized you can actually take advantage of `get` method of a `dict` object.

``````x = {i>100: 2, i<100: 1}.get(True, 0)
``````

Basically `i>100` and `i<100` cannot both be true, so if either of them is `True` you get the value you want(2 or 1), if none of them is `True`, you get `0`.

Questions:
``````x = 2*(i>100) | 1*(i<100)