本着短代码的精神......我有一个数字或空字符串列表,我希望map(int, mylist)
它不会失败。
mylist = "123//456".split("/") #['123', '', '456']
myints = <something to quickly convert the list>
编辑 我需要保持相同数量的令牌。即myints = [123, 0, 456]
。
我在想一些类似的东西map(lambda x: int(x) or 0, mylist)
,但是当然这仍然会抛出一个ValueError
. 有任何想法吗?
另一个编辑
一些结果(时间for xrange(1000000)
)...
- 2.03s
l = map(lambda x: x.isdigit() and int(x) or 0, mylist)
- 1.37s
l = [x.isdigit() and int(x) or 0 for x in mylist]
- 1.99s
l = map(lambda x: int(x) if x.isdigit() else 0, mylist)
- 1.35s
l = [int(x) if x.isdigit() else 0 for x in mylist]
- 1.24s
l = [int(x or 0) for x in mylist]
- 1.45s
l = [int(e) if e.strip() else 0 for e in mylist]
- 4.44s
the big chunk of code with try/except
ergo 越大越慢 :) 好的,并非总是如此
只是将这些包括在他们的时间里,因为它们没有产生所需的输出......
- 3.71s
l = map(int, re.findall('[0-9]+', "123//456"))
('课程正则表达式很慢。时间和地点) - 1.47s
l = map(int, filter(None, mylist))
- 1.15 秒
[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