python的itertools模块

名称解释
count - (start=0, step=1)创建一个可以无限迭代的迭代器, 支持设置起始位置和步长
cycle - (iterable)创建一个可以无限迭代的迭代器, 将参数无限循环生成
repeat - (object, num)将参数1, 按照指定的参数2, 生成一个迭代器
chain - (*iterable)将多个可迭代的对象链接到一起, 并生成一个迭代器
compress - (data, selectors)根据一个迭代对象的值是否为真, 决定是否返回另一个迭代对象的值
takewhile - (predicate, iterable)当不满足参数条件时, 停止迭代
dropwhile - (predicate, iterable)当不满足参数条件时, 开始迭代
filterfalse - (predicate, iterable)将满足条件的参数剔除
islice - (iterable, stop)类似于切片, 将可迭代对象进行切片操作
groupby - (iterable, key)将参数按照指定的函数进行分组, 将key函数作用于原循环器的各个元素。根据key函数结果,将拥有相同函数结果的元素分到一个新的循环器。每个新的循环器以函数返回结果为标签。
tee - (iterable, n=2)用于从 iterable 创建 n 个独立的迭代器,以元组的形式返回,n 的默认值是 2。
zip_longest - (*iterable)和zip函数的区别是, zip_longest会以长参数截至
permutations - (iterable, r)对参数取两个元素, 生成一个新的元组, 包含元素对调后的元组
combinations - (iterable, r)对参数取两个元素, 生成一个新的元组, 不包含元素对调后的元组, 也不包含一个元组内有相同的值
combinations_with_replacement - (iterable, r)对参数取两个元素, 生成一个新的元组, 不包含元素对调后的元组, 包含一个元组内有相同的值

count

import itertools

# count的第一个参数为迭代的起始位置, 第二个参数为步长(可以为负数)
# 注意count 可以无限迭代, 必须设置迭代停止条件
for i in itertools.count(10, -5):
    
    print(i)
    
    if i < -30:
        break

cycle

# 将"abc"无限循环生成
e_iter = itertools.cycle("abc")

for i in e_iter:
    print(i)
    if i == "b":
        break

repeat

# 将第一个参数 重复生成第二个参数遍, 返回迭代器
e_iter = itertools.repeat([1, 2, 3], 3)

print(type(e_iter))

for i in e_iter:
    print(i)

chain

a_list = [1, 2]
b_tuple = ("a", 3)
c_set = {"bb", 4}
d_dict = {"cc": "cc", "aa": "aa"}

# 可以将list, tupel, set, dict链接成一个新的迭代器(dict 只添加key)
e_iter = itertools.chain(a_list, b_tuple, c_set, e)

# 查看e_iter的类型为itertools
print(type(e_iter)) # <class 'itertools.chain'>

# 支持转为列表, 但不支持转为元组,集合等类型
print(list(e_iter)) # [1, 2, 'a', 3, 4, 'bb', 'cc', 'aa']
print(tuple(e_iter)) # ()
print(set(e_iter)) # set()

# 支持迭代
for i in e_iter:
    print(i)

compress

import itertools

a_list = [11, 22, 33, 44]
b_list = (0, 1, True, False, True, True)

e_iter = itertools.compress(a_list, b_list)
print(list(e_iter)) # [22]

takewhile

a_list = [11, 22, 33, 44, 55]

# 当lambda 不满足时, 停止迭代
e_iter = itertools.takewhile(lambda x : x < 33, a_list)

for i in e_iter:
    print(i)

dropwhile

# 当lambda 不满足条件时, 开始迭代
e_iter = itertools.dropwhile(lambda x : x < 33, a_list)

for i in e_iter:
    print(i)

fiterfalse

类似于filter函数,对迭代对象的内容进行过滤

a_list = [1, 2, 3, 0, None]

# 当条件为None时, 返回被迭代对象中为false的内容
e_iter = itertools.filterfalse(None, a_list)

for i in e_iter:
    print(i)


b_list = [1, 2, 3, 4]

# 这里时将满足lambda函数条件的结果排除, 将不满足的结果添加到e_iter中
e_iter = itertools.filterfalse(lambda x: x == 1, b_list)

for i in e_iter:
    print(i)

islice

a_list = [11, 22, 33, 44, 55]

# 对a_list进行切片操作, 第二个参数:起始位置, 第三个参数: 切片次数, 第四个参数:步长
e_iter = itertools.islice(a_list, 1, 4, 2)

for i in e_iter:
    print(i)

groupby

from itertools import groupby

def height_class(h):
    if h > 180:
        return "tall"
    elif h < 160:
        return "short"
    else:
        return "middle"


friends = [191, 158, 159, 165, 170, 180]

friendsss = groupby(friends, key=height_class)
for i, j in friendsss:
    print(i)
    print(list(j))

print('--------------------------------------')

data = "AaaBBbcCC"

datas = groupby(data, lambda x:x.upper())
for i, j in datas:
    print(i)
    print(list(j))

tee

e_iter = tee([1, 2], 3)

for i in e_iter:
    # 此行打印的是迭代器
    print(i)
    
    for j in i:
        # 此行打印的是每个迭代器内的数据
        print(j)

zip_longest

# 会以长的参数结束, 为空的参数为None
e_iter = zip_longest([1, 2, 3], ["a", "b", "c", "d"])

for i in e_iter:
    print(i)

permutations

对可迭代对象内的元素, 取一定数量的元素, 生成一个新的迭代器, 该迭代器由N个元组构成

a_list = [1, 2, 3]

# 对a_list取两个元素, 生成一个新的元组, 包含元素对调后的元组
e_iter = itertools.permutations(a_list, 2)

for i in e_iter:
    print(i)

combinations

# 对a_list取两个元素, 生成一个新的元组, 不包含元素对调后的元组, 也不包含一个元组内有相同的值
e_iter = itertools.combinations(a_list, 2)

for i in e_iter:
    print(i)

combinations_with_replacement

# 对a_list取两个元素, 生成一个新的元组, 不包含元素对调后的元组, 包含一个元组内有相同的值
e_iter = itertools.combinations_with_replacement(a_list, 2)

for i in e_iter:
    print(i)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值