关于python:将if-elif-else语句放在一行上?

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

我已经阅读了下面的链接,但它没有解决我的问题。
python是否有三元条件运算符?(问题是将if else语句压缩为一行)

写if-elif-else语句是否有一种更简单的方法,使它适合一行?< BR>例如,

1
2
3
4
5
6
if expression1:
   statement1
elif expression2:
   statement2
else:
   statement3

[更新]

1
2
3
4
5
6
if i>100:
    x=2
elif i<100:
    x=1
else:
    x=0

我只是觉得如果上面的例子可以用下面的方式写,它看起来会更简洁。

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

不,这是不可能的(至少不是任意陈述),也不可取。将所有内容都放在一行上很可能会违反PEP-8,其中规定行的长度不应超过80个字符。

它也反对python的禅:"可读性很重要"。(在python提示下键入import this以读取整个内容)。

可以在python中使用三元表达式,但只能用于表达式,不能用于语句:

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

编辑:

现在,您修改的问题表明,这三个语句是相同的,除了要分配的值。在这种情况下,链接的三元运算符确实有效,但我仍然认为它不太可读:

1
2
3
4
5
6
7
8
9
10
11
12
>>> 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


如果对于不同的情况只需要不同的表达式,那么这可能适用于您:

1
expr1 if condition1 else expr2 if condition2 else expr

例如:

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


只需在else语句中嵌套另一个if子句。但这并不能让它看起来更漂亮。

1
2
3
4
5
6
7
8
9
>>> 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'


您可以选择实际使用dictget方法:

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

如果保证其中一个键对True进行评估,则不需要使用get方法:

1
x = {i<0: -1, i==0: 0, i>0: 1}[True]

在理想情况下,至多其中一个键应该对True进行评估。如果多个键对True进行评估,结果可能看起来不可预测。


在我看来,还有一种选择是不可读的,但我还是会把它作为一种好奇心来分享:

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

这里有更多信息:https://docs.python.org/3/library/stdtypes.html布尔运算与否


1
2
3
4
5
6
if i > 100:
    x = 2
elif i < 100:
    x = 1
else:
    x = 0

如果要在一行中使用上述代码,可以使用以下代码:

1
x = 2 if i > 100 else 1 if i < 100 else 0

这样做时,如果i>100,x将被分配为2;如果i<100,x将被分配为1;如果i=100,x将被分配为0。


People have already mentioned ternary expressions. Sometimes with a simple conditional assignment as your example, it is possible to use a mathematical expression to perform the conditional assignment. This may not make your code very readable, but it does get it on one fairly short line. Your example could be written like this:

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

比较将是对的或错的,当与数字相乘时,将是1或0。可以用一个+代替中间的一个。


这也取决于你表达的本质。关于"不这样做"的其他答案的一般性建议对于泛型语句和泛型表达式非常有效。

但是,如果您只需要一个"dispacth"表,比如根据给定选项的值调用不同的函数,那么您可以将要调用的函数放在字典中。

类似:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def save():
   ...
def edit():
   ...
options = {"save": save,"edit": edit,"remove": lambda :"Not Implemented
<hr><P>可以使用嵌套的三元if语句。</P>[cc lang="
python"]# if-else ternary construct
country_code = 'USA'
is_USA = True if country_code == 'USA' else False
print('is_USA:', is_USA)

# if-elif-else ternary construct
# Create function to avoid repeating code.
def get_age_category_name(age):
    age_category_name = 'Young' if age <= 40 else ('Middle Aged' if age > 40 and age <= 65 else 'Senior')
    return age_category_name

print(get_age_category_name(25))
print(get_age_category_name(50))
print(get_age_category_name(75))