首页 > 解决方案 > 在理解中重用表达式

问题描述

是否有可能在理解中重用一个可能很大、计算成本高或像生成器一样非幂等的子表达式?

假设有一个要转换为字典的字符串列表:

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

可以做到吗?

标签: pythondictionary-comprehension

解决方案


a = ['ab: 1', 'cd: 2', 'ef:3']

使用带有 map 和字典理解的生成器表达式。

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'}

中的每个项目都a被拆分一次,结果列表中的项目被剥离一次。这些函数的执行被延迟到执行字典理解为止。


推荐阅读