Python常用迭代器操作图解

  • map() 将一个函数应用于可迭代对象的每个元素,并返回结果列表。
  • filter() 使用指定的函数过滤可迭代对象的元素,并返回满足条件的元素组成的迭代器。
  • enumerate() 返回一个由索引和元素组成的元组的迭代器,常用于同时遍历索引和元素。
  • zip() 将多个可迭代对象的对应元素打包成元组的迭代器。
  • itertools.zip_longest()zip() 类似,但在处理不等长的可迭代对象时,会使用填充值填充缺失的元素。
  • itertools.tee() 复制可迭代对象的内容,生成两个相互独立的迭代器。
  • itertools.groupby() 用于对可迭代对象进行分组。它会返回一个由分组键和对应的迭代器组成的迭代器。

map()

scss 复制代码
li = [1, 2, 3]

# mapped_li 是一个 map object(Iterable) 而不是list
mapped_li = map(lambda x: str(x), li) 

# 若要变为list,则需要转换
mapped_list_li = list(mapped_li) # ['1', '2', '3']

# map操作可用生成器表达式代替,更清晰
mapped_li = [str(x) for x in li] # ['1', '2', '3']

filter()

ini 复制代码
li = [1, 2, 3]

# filtered_li 是一个 filter object(Iterable) 而不是list
filtered_li = filter(lambda x: x == 1, li) 

# 若要变为list,则需要转换
filtered_list_li = list(filtered_li) # [1]

# filter操作可用生成器表达式代替,更清晰
filtered_li = [x for x in li if x == 1] # [1]

enumerate()

css 复制代码
li = [5, 2, 0]

for i, x in enumerate(li):
 print(i, x)

# 0 5
# 1 2
# 2 0

enumerate([5, 2, 0]) 可以理解为 ((0, 5), (1, 2), (2, 0)) ,即 ((index, value), ...) 不过实际上这并不是一个元组,而是一个 enumerate object

zip()

ini 复制代码
li1 = [1, 2, 3]
li2 = [4, 5, 6]
li3 = [7, 8, 9]

zipped_li = zip(li1, li2, li3) # 同理,并不是list,而是zip object
zipped_list_li = list(zipped_li) # [(1, 4, 7), (2, 5, 8), (3, 6, 9)]

for x, y, z in zip(li1, li2, li3):
 ...
 
# 举例
students = ['小左', '小瑞', '小海']
schools = ['清华', '北大', '复旦']
homes = ['小左家', '小瑞家', '小海家']

for stu, school, home in zip(students, schools, homes):
 print(f'{stu}是{school}的学生,他在{home}')
 
# 小左是清华的学生,他在小左家
# 小瑞是北大的学生,他在小瑞家
# 小海是复旦的学生,他在小海家

itertools.zip_longest()

ini 复制代码
from itertools import zip_longest

li1 = [1, 2, 3]
li2 = [5, 6]
li3 = [9]

# 同理,并不是list,而是zip_longest object
zipped_li = zip_longest(li1, li2, li3, fillvalue=0) 
zipped_list_li = list(zipped_li) # [(1, 5, 9), (2, 6, 0), (3, 0, 0)]

itertools.tee()

ini 复制代码
from itertools import tee

li = [1, 2, 3]

li1, li2 = tee(li)

list_li1 = list(li1) # [1, 2, 3]
list_li2 = list(li2) # [1, 2, 3]

itertools.groupby()

less 复制代码
from itertools import groupby

data = [('A', 1), ('A', 2), ('B', 3), ('B', 4), ('B', 5)]

for key, group in groupby(data, key=lambda x: x[0]):
    print(key, list(group))

# A [('A', 1), ('A', 2)]
# B [('B', 3), ('B', 4), ('B', 5)]
相关推荐
华仔啊14 分钟前
为啥不用 MP 的 saveOrUpdateBatch?MySQL 一条 SQL 批量增改才是最优解
java·后端
武子康1 小时前
大数据-242 离线数仓 - DataX 实战:MySQL 全量/增量导入 HDFS + Hive 分区(离线数仓 ODS
大数据·后端·apache hive
砍材农夫2 小时前
TCP和UDP区别
后端
千寻girling2 小时前
一份不可多得的 《 Django 》 零基础入门教程
后端·python·面试
千寻girling2 小时前
Python 是用来做 AI 人工智能 的 , 不适合开发 Web 网站 | 《Web框架》
人工智能·后端·算法
贾铭2 小时前
如何实现一个网页版的剪映(三)使用fabric.js绘制时间轴
前端·后端
xiaoye20182 小时前
Spring 自定义 Redis 超时:TTL、TTI 与 Pipeline 实战
后端
程序员爱钓鱼5 小时前
GoHTML解析利器:github.com/PuerkitoBio/goquery实战指南
后端·google·go
golang学习记5 小时前
从“大泥球“到模块化单体:Spring Modulith + IntelliJ IDEA 拯救你的代码
后端·intellij idea
颜酱6 小时前
一步步实现字符串计算器:从「转整数」到「带括号与优化」
javascript·后端·算法