python 列表推导式中的 if-else

rob*_*ams 2 python list-comprehension python-2.7 python-3.x

是否可以为以下 python 代码编写列表推导式:

for str in range(0,len(mixed_content)):
    if (mixed_content[str].isdigit()):
        num_list.append(mixed_content[str])
    else:
        string_list.append(mixed_content[str])
Run Code Online (Sandbox Code Playgroud)

我们可以在列表推导式中使用 else 块吗?我尝试为上述代码编写列表推导式:

num_list , string_list = [   mixed_content[str]  for str in range(0,len(mixed_content)) if(mixed_content[str].isdigit()) else ]
Run Code Online (Sandbox Code Playgroud)

Jea*_*bre 6

这是不可能的,但是如果您正在寻找单行代码,您可以在循环中使用三元表达式来实现(保存测试并且紧凑):

num_list=[]
string_list=[]
for s in ["45","hello","56","foo"]:
    (num_list if s.isdigit() else string_list).append(s)

print(num_list,string_list)
Run Code Online (Sandbox Code Playgroud)

结果:

['45', '56'] ['hello', 'foo']
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 尽管有括号的语法和问题的上下文,但(num_list if s.isdigit() else string_list)它不是一个生成器,一个三元表达式(在括号之间保护以对抗.append优先级),num_list如果 s 是(正)数字序列,string_list否则返回s。
  • 此代码不适用于负数,因为isdigits将返回 false。你必须为此编写一个特殊的函数(SO上的经典问题)