gpt4 book ai didi

python-3.x - 为什么链接可迭代对象这么复杂?简化这段代码

转载 作者:行者123 更新时间:2023-12-04 00:56:00 25 4
gpt4 key购买 nike

我想链接多个可迭代对象,一切都带有惰性求值(速度至关重要),以执行以下操作:

  • 从一大行标准输入中读取许多整数
  • split() 那一行
  • 将结果字符串转换为 int
  • 计算连续整数之间的差异
  • ...以及此处未显示的其他内容

真实的例子比较复杂,下面是一个简化的例子:

这是标准输入的示例行:2 13 4 16 16 15 22 17 8 8 7 6

(出于调试目的,下面的 instream 可能指向 sys.stdin 或打开的文件句柄)

您不能简单地链接生成器,因为 map() 返回一个(延迟计算的)列表:

import itertools
gen1 = map(int, (map(str.split, instream))) # CAN'T CHAIN DIRECTLY

我找到的最简单的工作解决方案是这个,难道不能简化吗?

gen1 = map(int, itertools.chain.from_iterable(itertools.chain(map(str.split, instream))))

我到底为什么需要链接 itertools.chain.from_iterable(itertools.chain 只是为了处理来自 map(str.split, instream) 的结果 - 它有点违背目的?手动定义生成器是否更快?

最佳答案

与使用 mapfilter 相比,应该优先使用显式(“手动”)生成器表达式。它对大多数人来说更易读,也更灵活。

如果我理解你的问题,这个生成器表达式就可以满足你的需要:

gen1 = ( int(x) for line in instream for x in line.split() )

关于python-3.x - 为什么链接可迭代对象这么复杂?简化这段代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27443890/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com