问题描述
|
有什么方法可以用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]
无效,因为您无法可靠地将and和/或构造使用None
。 (即使p==\'None\'
为true,ѭ3to也等于false,因此将其移至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)
不,语法无效。
a = []
for p in parts:
if p==\'None\':
k = None;
else:
k = int(p)
a.append(k)
啊!最后。但是,难道没有较短的方法可以编写这样一个简单的循环吗?
解决方法
您几乎完全正确:
[None if p == \'None\' else int(p) for p in parts]
,差不多了:
[int(p) if p != \'None\' else None for p in parts]
,[ [int,eval] [p==\'None\'] (p) for p in parts]
应保存为eval,仅在字符串\'None \'上调用。
,您的代码中确实只有一个地方需要进行此转换吗?如果没有,请定义一个函数,然后使其成为多行,带有注释的且易于遵循。这样,您可以隐藏代码的复杂性,并使主代码易于阅读。
,一个更简单的解决方案是:
parts = [\'0\',\'1\',\'None\',\'5\',\'4\']
[int(p) for p in parts if p.isdigit()]
但是,此处不接受float。如果必须将float字符串(??我不知道该怎么称呼)整数,则可以考虑以下内容:
parts = [\'0\',\'4\']
[int(p.split(\".\")[0]) for p in parts if p.replace(\".\",\"\",1).isdigit()]