也许可以这样表述:
dict(map(lambda x: x.strip(), item.split("=")) for item in PARAMS.split(";"))
或者另一种更加优雅的版本:
dict((l[i].strip(), l[i+1].strip()) for i in range(2) for l in [re.split(';|=', PARAMS)])
当然,如果您将其视为“模糊”的同义词,那么这只是一种优雅的方式。但是当我们寻找一行代码时,这不是我们想要的吗?
为了解决这个问题,我可能会写下以下代码:
d = dict();
for item in PARAMS.split(";"):
key, value = item.split("=")
d[key.strip()] = value.strip()
这个解决方案比目前提出的所有答案都更易读且更快,而且我甚至没有进行任何优化,因此可能不是最佳解决方案。
不要只听言语,可以测试不同的解决方案来检查:
PARAMS = 'TEST = xy; TEST2= klklk '
from timeit import timeit
print 'obfuscated', timeit('dict((l[i].strip(), l[i+1].strip()) for i in range(2) for l in [re.split(";|=", PARAMS)])', "from __main__ import PARAMS; import re")
print 'tuple', timeit('dict((i.strip() for i in item.split("=")) for item in PARAMS.split(";"))', "from __main__ import PARAMS")
print 'regex', timeit('dict(re.findall(r"(\S+)\s*=\s*([^\s;]+)", PARAMS))', "from __main__ import PARAMS; import re")
print 'lambda', timeit('dict(map(lambda x: x.strip(), item.split("=")) for item in PARAMS.split(";"))', "from __main__ import PARAMS; import re")
print 'list comprehension', timeit('dict([i.strip() for i in item.split("=")] for item in PARAMS.split(";"))', "from __main__ import PARAMS")
print 'replace spaces', timeit('dict(item.split("=") for item in PARAMS.replace(" ", "").split(";"))', "from __main__ import PARAMS; import re")
print 'not one line', timeit(
'''
d = dict();
for item in PARAMS.split(";"):
key, value = item.split("=")
d[key.strip()] = value.strip()
d
''',
"from __main__ import PARAMS")
以下是时间结果:
- 模糊化:7.36826086044
- 元组:4.49374079704
- 正则表达式:3.61684799194
- Lambda:3.51627087593
- 列表推导式:2.90777206421
- 替换空格:2.46001887321
- 非单行代码:1.71015286446
它本身说明了问题。
注:“非单行代码”更快的原因可能是因为它避免了创建不必要的列表结构,直接将值存储在字典中。但这是显而易见的,甚至是无意识的。