是否有可能在理解中重用子表达式,该子表达式可能很大,计算起来很昂贵,或者像生成器一样是非幂等的?
说有要转换为字典的字符串列表:
items = ['ab: 1', 'cd: 2', 'ef:3'] ===> {'ab': '1', 'cd': '2', 'ef': '3'}
循环一次计算“昂贵”的拆分表达式:
d = {}
for item in items:
k, v = item.split(':', maxsplit=1)
d.update({k.strip(): v.strip()})
理解将为每个输出元素重复计算:
d = {x.split(':', maxsplit=1)[0].strip(): x.split(':', maxsplit=1)[1].strip() for x in items}
但是所需的解决方案是一种理解,该表达式只计算一次表达式,然后重新使用它:
d = {k.strip(): v.strip() for x in items for k, v in x.split(':', maxsplit=1)} # Wrong - need an assignment
可以完成吗?
a = ['ab: 1', 'cd: 2', 'ef:3']
将生成器表达式与map和字典一起使用comprehension。
In [46]: b = (map(str.strip,thing.split(':')) for thing in a)
In [47]: d = {k:v for (k,v) in b}
In [48]: d
Out[48]: {'ab': '1', 'cd': '2', 'ef': '3'}