1 致谢

感谢网友“-柚子皮-”的帮助,

原文链接如下:

https://blog.csdn.net/pipisorry/article/details/45171451

感谢 Python Software Foundation的指导,

Python官方doc的链接如下:

https://docs.python.org/zh-cn/3/library/itertools.html#itertools.chain.from_iterable

2 前言

今天在阅读Detectron2的示例代码时,看到他们用了一个这样的语句做迭代器的链接:

# 上面是一些其他的标注信息的赋值代码……
annos = v["regions"]
objs = []
for _, anno in annos.items():assert not anno["region_attributes"]anno = anno["shape_attributes"]px = anno["all_points_x"]py = anno["all_points_y"]poly = [(x + 0.5, y + 0.5) for x, y in zip(px, py)]poly = list(itertools.chain.from_iterable(poly))# 这里使用itertools.chain.from_iterable来将poly列表转换为一个chain迭代器obj = {"bbox": [np.min(px), np.min(py), np.max(px), np.max(py)],"bbox_mode": BoxMode.XYXY_ABS,"segmentation": [poly],"category_id": 0,"iscrowd": 0}objs.append(obj)
record["annotations"] = objs
dataset_dicts.append(record)

我感觉挺奇怪的,于是就查了一下,后来发现这是一种比较高效的连接多个迭代器的方法~

3 使用itertools.chain.from_iterable将多个迭代器进行高效的连接

3.1 itertools.chain.from_iterable的作用

itertools.chain.from_iterable可以用来连接多个迭代器,我们可以看看官方文档给出的介绍,

可以看到他可以连接两个迭代器'ABC''DEF'

其中输入参数iterables是多个迭代器的list类型,

3.2 将多个迭代器进行高效的连接

官方文档在sum(iterable, /, start=0)的描述中也建议到:

To concatenate a series of iterables, consider using itertools.chain().

其实这样做的原因我们在3.1中就看到,也就是“从一个单独的可迭代参数中得到链式输入,该参数是延迟计算的。”,说明这里使用的是懒汉式的读取模式,所以在一定程度上可以提高读取数据的效率,因为不用一开始就获得整个的list,这也是iterable类型的优势之一;

3.3 备注

使用itertools.chain.from_iterable会使代码变得清晰易懂

感觉使用itertools.chain.from_iterable的可读性比使用sum(iterable, /, start=0)的可读性要高一些;

Python——itertools.chain.from_iterable将多个迭代器连接成一个统一的迭代器的最高效的方法相关推荐

  1. Python Itertools.chain()用法【将一组迭代对象串联起来,形成一个更大的迭代器】

    它是一个需要一系列可迭代对象并返回一个可迭代对象的函数.它将所有可迭代对象组合在一起,并生成一个可迭代对象作为输出. 场景一:  chain()可以把一组迭代对象串联起来,形成一个更大的迭代器: &g ...

  2. Python itertools chain

    v1 = [11,22,33] v2 = [44,55,66]new = chain(v1,v2) for item in new:print(item) from itertools import ...

  3. Python itertools 部分用法

    过滤的部分用法 import itertoolsdef vowel(c):return c.lower() in 'aeiou'name = 'Aardvark'print(list(filter(v ...

  4. python itertools 使用详解

    文章目录 (一)itertools 的所有函数说明 无穷迭代器包含的 函数列表 1.count( start [,step]) 2.cycle( iterable ) 3.repeat( elem [ ...

  5. python chain.from_iterable()

    该函数chain.from_iterable()属于终止迭代器类别.此函数以单个iterable作为参数,并且输入iterable的所有元素也应该是可迭代的,并且他返回包含输入iterable的所有元 ...

  6. python itertools模块chain函数功能详解 itertools.chain(*iterable)

    Itertools模块, itertools提供了高效快捷的用于操作迭代对象的函数.通过使用这个模块,可以简化代码. Itertools.chain语法 Itertools.chain(*iterab ...

  7. python技巧(1)--如何转换itertools.chain对象为数组

    总第 115 篇文章,本文大约 900 字,阅读大约需要 3 分钟 之前做1月总结的时候说过希望每天或者每2天开始的更新一些学习笔记,这是开始的第一篇. 这篇介绍的是如何把一个 itertools.c ...

  8. Python -itertools模块combinations方法

    itertools模块combinations(iterable, r)方法可以创建一个迭代器,返回iterable中所有长度为r的子序列,返回的子序列中的项按输入iterable中的顺序排序. 例1 ...

  9. python itertools模块_Python标准模块--itertools

    1 模块简介 Python提供了itertools模块,可以创建属于自己的迭代器.itertools提供的工具快速并且节约内存.开发者可以使用这些工具创建属于自己特定的迭代器,这些特定的迭代器可以用于 ...

最新文章

  1. Mysql优化之开山篇
  2. php ip处理函数,PHP取ip地址函数
  3. docker版本Mysql安装
  4. 对阵Flash 实战HTML 5技巧之页面设计
  5. python3爬虫-通过requests爬取图虫网
  6. 索引 2 超出范围。_重点推荐:音响灯光行业搜索引擎推广教学
  7. SD-WAN技术分析
  8. mysql 索引 hash_Mysql中索引类型,B-tree、Hash索引怎么实现的以及其特点?
  9. Transact-SQL 存储过程(c#调用执行)
  10. 如何摆脱工具类【转载】
  11. word转换html 批量,Word批量转HTML工具
  12. 计算机网络第8版课后习题答案整理
  13. 口布杯花的60种叠法_10种餐巾折花杯花的步骤用文字解说怎么折
  14. 网易邮箱登录php,PHP模拟登陆163邮箱发邮件及获取通讯录列表的方法
  15. Win10喇叭图标出现红叉提示未安装任何音频输出设备
  16. vlc搭建流媒体转发服务器
  17. MySQL联合主键保存_mysql联合主键
  18. Kali Linux系统正确安装指南教程(一)MAC安装kail+Vmware Fusion详细教程(吐血本人测试10次)
  19. 如何解决微信端不能直接跳转浏览器
  20. 全球及中国浆液阀行业市场深度分析及发展战略咨询报告2022-2028年

热门文章

  1. 30秒清除你电脑中的垃圾
  2. ADO.NET 如何读取 Excel (下)
  3. tomcat启动很慢的解决方式
  4. 两个经典的Oracle触发器示例
  5. 解决Ajax中IE浏览器缓存问题
  6. PHP的几个常用加密函数
  7. 最大连续区间和的算法总结(转)
  8. spring+mybatis 多数据源切换
  9. C# DateTime 日期加1天 减一天 加一月 减一月 等方法
  10. python socket.error: [Errno 10054] 远程主机强迫关闭了一个现有的连接。问题解决方案