用Python在一行中写这个,甚至更好,作为表达式而不是语句?
parts = ['0', '1', 'None', '5', '4']
[int(p) for p in parts]
这当然会出错,
ValueError: invalid literal for int() with base 10: 'None'
所以:
[p=='None' and None or int(p) for p in parts]
不起作用,因为您无法可靠地使用{/ 1}}和/或构造。 (即使None
为真,p=='None'
也相当于false,因此会转到None
部分。)
or
也行不通。我想它会在条件之前评估[int(p) if p=='None' else None for p in parts]
? (似乎奇怪的语义。)
int(p)
没有,语法无效。
a = []
for p in parts:
if p=='None': k = None; else: k = int(p)
a.append(k)
啊!最后。但是,编写这样一个简单的循环是否有更短的方法呢?
答案 0 :(得分:13)
你几乎做对了:
[None if p == 'None' else int(p) for p in parts]
答案 1 :(得分:7)
几乎拥有它:
[int(p) if p != 'None' else None for p in parts]
答案 2 :(得分:4)
[ [int, eval] [p=='None'] (p) for p in parts]
应该保存为eval仅在字符串'None'上调用。
答案 3 :(得分:0)
你真的只需要在代码中有一个地方需要这个变换吗?如果没有,请定义一个函数,然后使其成为多行,注释并易于理解。这样就可以隐藏代码的复杂性,并使主代码易于阅读。
答案 4 :(得分:0)
更简单的解决方案是:
parts = ['0', '1', 'None', '5', '4']
[int(p) for p in parts if p.isdigit()]
但是,这里不接受浮动。如果浮点字符串(我不知道该怎么称)到整数是必要的,你可以考虑以下几点:
parts = ['0', '1', 'None', '5', '4']
[int(p.split(".")[0]) for p in parts if p.replace(".", "", 1).isdigit()]