Python:字符串转换为整数或出错时为零,无需尝试/异常

2024-04-28 09:58:54 发布

您现在位置:Python中文网/ 问答频道 /正文

本着简短代码的精神。。。我有一个数字或空字符串的列表,我希望map(int, mylist)不会失败。在

mylist = "123//456".split("/") #['123', '', '456']
myints = <something to quickly convert the list>

需要编辑相同的令牌数。一、 e.myints = [123, 0, 456]。在

我想的是map(lambda x: int(x) or 0, mylist),但这当然还是抛出了ValueError。有什么想法吗?在


另一个编辑

一些结果(计时for xrange(1000000))。。。在

  • 2.03秒
  • 1.37sl = [x.isdigit() and int(x) or 0 for x in mylist]
  • {EE8><1.99米
  • 1.35sl = [int(x) if x.isdigit() else 0 for x in mylist]
  • 1.24秒
  • 1.45秒
  • 4.44sthe big chunk of code with try/except所以越大越慢:)好吧,不总是这样

只是包括这些时间,因为他们不产生期望的输出。。。在

  • 3.71sl = map(int, re.findall('[0-9]+', "123//456"))('过程正则表达式很慢。时间和地点)
  • 1.47秒
  • 1.15s[int(x) for x in mylist if x](好时候!)在

我应该提一下,re.compile将3.71秒降至2.11秒。

Python 2.7.3, Xeon E5-1607

myints = [int(x or 0) for x in mylist]不仅最快,结果正确,而且非常短,只有29个字符。在

谢谢大家的意见!不太可能是落选者:P


Tags: or代码inre编辑精神mapfor
3条回答

短并不总是最好的,但这是相当短的:

>>> [int(e) if e.strip() else 0 for e in "123//456".split("/")]
[123, 0, 456]

同时:

^{pr2}$

简短,尽管不如其他答案可靠--x必须是空字符串或数字:

[int(x or 0) for x in mylist]
myints = map(lambda x: int(x) if x.isdigit() else 0, "123//456".split("/")) # returns [123, 0, 456]

如您所愿,它保持相同数量的标记,并将非数字字符串替换为零。在

编辑:您也可以通过理解进行编辑:

^{pr2}$

相关问题 更多 >