如果在Python中没有为None

时间:2011-05-19 22:18:26

标签: python

用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)

啊!最后。但是,编写这样一个简单的循环是否有更短的方法呢?

5 个答案:

答案 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()]