python - 在理解中重用表达式
问题描述
是否有可能在理解中重用一个可能很大、计算成本高或像生成器一样非幂等的子表达式?
假设有一个要转换为字典的字符串列表:
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 和字典理解的生成器表达式。
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
被拆分一次,结果列表中的项目被剥离一次。这些函数的执行被延迟到执行字典理解为止。
推荐阅读
- python - 在处理带有 None 的行时,在 pandas 列中提取 JSON 以分隔列
- vba - 如何使用 VBA 将图像裁剪为特定形式,例如 PowerPoint 中的圆圈?
- office365api - asp dotnet core如何连接邮箱
- powershell - 如何模拟点源脚本?
- php - PHP - 多维数组检查重复项(没有 array_unique)
- c# - 使用linq或数据视图过滤器从c#中的DataTable中获取最高日期行
- scala - 类型别名和隐式值解析
- apache-spark - 线程“main”java.sql.SQLException 中的异常:运行 spark-submit 时没有合适的驱动程序
- django - 在 django 中访问 api 时您无权执行此操作
- python - 在 Keras 的 lstm 网络中使用哪个激活函数进行序列预测?