input = "foo ,,bar ,baz,"
tags = [x.strip() for x in input.split(',') if len(x.strip()) > 0]
期望的输出显然是一个没有空字符串的列表。
问题是在微观优化的精神中; 是否有一种方法可以不要两次对候选项x进行strip()操作,即一次用于测试,一次用于添加?
换句话说,您能否在表达式中生成一个值,该值可以附加到列表中而不必两次执行该操作?
input = "foo ,,bar ,baz,"
tags = [x.strip() for x in input.split(',') if len(x.strip()) > 0]
x.isspace()
将返回。tags = [x.strip() for x in input.split(',') if x and not x.isspace()]
text = 'foo ,,bar ,baz,'
(我使用text
代替input
,因为input
是内置函数名称。避免与内置函数重名。)
首先,len(x.strip()) > 0
可以简单(且更有效率地)写作x.strip()
。
tags = [x.strip() for x in text.split(',') if x.strip()]
如果你真的想要,你可以只做一次带状体,但我不确定这样是否更快:
tags = [x for x in (x.strip() for x in text.split(',')) if x]
tags = filter(bool, map(lambda x: x.strip(), text.split(',')))
性能数据:
>>> from timeit import timeit
>>> timeit(lambda: [x.strip() for x in text.split(',') if x.strip()])
1.9443869590759277
>>> timeit(lambda: [x for x in (x.strip() for x in text.split(',')) if x])
2.1135239601135254
>>> timeit(lambda: filter(bool, map(lambda x: x.strip(), text.split(','))))
2.52907395362854
正如您所看到的,第一个是最快的。
if x and not x.isspace()
比if x.strip()
更快。 - Chris Morgan这也可以运行...
text = "foo ,,bar ,baz,"
text.replace(',',' ').split()
text = "foo,,bar,,baz"
。将 ',' 替换为空格,即 text.replace(',', ' ').split()
更好。 - mhawke"foo bar, baz"
处出现问题,将其分成 3 个项目而不是 2 个。 - Karl Knechtel