Python中的迭代工具包 - itertools

itertools

是python中的一个工具包, 其中的方法来帮助你生成各种各样的 iterator , 化繁为简, 下面是我的一个简单梳理, 具体解释点下面官方文档

官方文档: Python - itertools
方法的中文名都不是官方定义的, 是我自己取的, 要是有更好的名称可以评论告诉我
from itertools import *
1. 累加 (accumulate)
传入iterable , 将其中每个元素累加起来
list(accumulate([1,2,3,4])
# 输出 [1, 3, 6, 10]
# 用 next() 依次输出 1, 3, 6, 10
2. 链接 (chain)
传入iterable , 将其中每个 iterable 链接起来
a = ['123','456']
b = ['789','abc']
print(f'对于多个iter: {list(chain(a,b))}')
print(f'对于单个iter: {list(chain(*a,*b))}')

print(f'指明参数为iter:{list(chain.from_iterable(a))}')
# 输出
# 对于多个iter: ['123', '456', '789', 'abc']
# 对于单个iter: ['1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c']
# 指明参数为iter:['1', '2', '3', '4', '5', '6']
3. 组合 (combination & combinations_with_replacement)
传入iterable , 按照第二个参数进行组合
# 组合器 不允许重复
print(f"字母不重复:{list(combinations('ABC',2))}")
print(f"range方法:{list(combinations(range(3),2))}")

# 组合替换 允许重复
print(f"字母重复:{list(combinations_with_replacement('ABC',2))}")

# 输出
# 字母不重复:[('A', 'B'), ('A', 'C'), ('B', 'C')]
# range方法:[(0, 1), (0, 2), (1, 2)]
# 字母重复:[('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'B'), ('B', 'C'), ('C', 'C')]
4. 排列 (permutation)
  • 对 iterable 按照 k 的数量进行排列
list(permutations(range(3),2))

# 输出
# [(0, 1), (0, 2), (1, 0), (1, 2), (2, 0), (2, 1)]
5. 匹配 (compress)
  • 传入 iterable , 将满足第二个参数的中为true的输出
print(f"按照第二个iter匹配,为1的显示,0不显示:{list(compress('abcde',[0,1,1,0,1]))}")

# 输出
# 按照第二个iter匹配,为1的显示,0不显示:['b', 'c', 'e']
6. 计数 (count)
  • 传入start, step , 将在start的基础上进行计数输出
coun = count(10,3)
print(next(coun),next(coun),next(coun))
# 输出
# 10,11,12
7. 周期循环 (cycle)
  • 对传入的 iterable 进行无限循环
cycl = cycle('abc')
print(next(cycl),next(cycl),next(cycl),next(cycl),next(cycl),next(cycl))
# 输出
# a b c a b c
8. 重复 (repeat)
  • 对传入的 任何值 进行 k 次循环
list(repeat(4,3))
# 输出
# 4,4,4
9. 忽略循环 (takewhile & dropwhile)
  • takewhile 不满足条件则停止迭代, 从第一个满足条件的值开始输出
  • dropwhile 满足条件则跳过, 从第一个不满足条件的值开始输出
# 满足条件则跳过, 从第一个不满足条件的值开始输出
dw = dropwhile(lambda x: x<5, [1, 4, 6, 4, 1])
print('满足条件则跳过, 从第一个不满足条件的值开始输出:',next(dw),next(dw),next(dw))

# 不满足条件则停止迭代, 从第一个满足条件的值开始输出
tw = takewhile(lambda x: x<5, [1, 4, 6, 4, 1])
print('不满足条件则停止迭代, 从第一个满足条件的值开始输出:',next(tw),next(tw))
# 输出
# 满足条件则跳过, 从第一个不满足条件的值开始输出: 6 4 1
# 不满足条件则跳过, 从第一个满足条件的值开始输出: 1 4
10. 过滤 (filter& filterfalse)
  • filter 过滤符合条件的值
  • dropwhile 过滤不符合条件的值
filt = filter(lambda x:x%2,range(10))
print('符合条件的值过滤:',next(filt),next(filt),next(filt),next(filt))

ff = filterfalse(lambda x:x%2,range(10))
print('不符合条件的值过滤:',next(ff),next(ff),next(ff),next(ff))
# 输出
# 符合条件的值过滤: 1 3 5 7
# 不符合条件的值过滤: 0 2 4 6
11. 分组 (grouby)
  • 对 iterable 进行分组, 具体解释看官网吧, 我就把例子放在这了
print(list([k for k, g in groupby('AAAABBBCCDAABBB')]))
print(list([list(g) for k, g in groupby('AAAABBBCCD')]))
# 输出
# ['A', 'B', 'C', 'D', 'A', 'B']
# [['A', 'A', 'A', 'A'], ['B', 'B', 'B'], ['C', 'C'], ['D']]
12. 切片 (islice)
  • islice(iterable,stop)
  • islice(iterable,start,stop,[step])
list(islice('ABCD',2))
# 输出
# ['A', 'B']
13. 笛卡尔积 (product)
list(product('abc','xy'))
# 输出
# [('a', 'x'), ('a', 'y'), ('b', 'x'), ('b', 'y'), ('c', 'x'), ('c', 'y')]
14. 星图 (startmap)
  • startmap(func, iterable)
  • 对 iterable 按照 func 的处理方式进行处理
list(starmap(pow,[[2,2],(2,5),(4,2)]))
# 输出
# [4.0, 32.0, 16.0]
15. 分裂 (tee)
  • 将一个可迭代对象分裂成多个可迭代对象, 就像细胞分裂一样
  • tee(iterable , n)
tee([1,2],2)
# 按照 [1,2] 生成 2 个 [1,2]
16. zip补齐 (zip_longest)
  • 原始zip任意一方超出则截止, zip_longest使用 fillvalue 将超出的部分补齐
  • zip(iterable , ,iterable, fullvalue)
print("原始zip:",list(zip([1,2,3],['a','b'])))
print("zip_longest:",list(zip_longest([1,2,3],['a','b'],fillvalue='补齐')))
# 输出
# 原始zip: [(1, 'a'), (2, 'b')]
# zip_longest: [(1, 'a'), (2, 'b'), (3, '补齐')]

Just it

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值