大家好,我是涛哥,今天为大家分享itertools库常用功能,并且为大家提供示例,全文5000字,大约阅读15分钟。
什么是 itertools
?
itertools
是Python的一个内置模块,它提供了一系列用于迭代的函数,可用于有效地创建迭代器,组合、操作和处理数据。下面是一些itertools
中最常用的功能:
1. 无限迭代器
itertools.count(start, step)
itertools.count(start, step)
函数用于生成一个无限迭代的整数序列。它从 start
开始,并以 step
作为步长不断生成整数。
以下是一个展示 itertools.count()
的示例代码:
import itertools
# 从 5 开始,步长为 2,生成整数序列
for i in itertools.count(5, 2):
if i > 20:
break
print(i, end=' ')
在这个示例中,itertools.count(5, 2)
生成一个从 5 开始,步长为 2 的整数序列。这个序列将生成满足条件 i > 20
的整数,并在满足条件后停止迭代。
itertools.cycle(iterable)
itertools.cycle(iterable)
函数用于创建一个无限循环迭代器,不断重复提供的可迭代对象中的元素。
以下是一个演示 itertools.cycle()
的示例代码:
import itertools
# 定义一个列表
data = [1, 2, 3]
# 使用 cycle 无限重复可迭代对象中的元素
for i in itertools.cycle(data):
print(i, end=' ')
if i == 3: # 为避免无限循环,手动设定循环结束条件
break
在这个例子中,itertools.cycle(data)
会不断重复列表 [1, 2, 3]
中的元素。因为这是一个无限循环,这里手动设置了 if i == 3
的条件来结束循环。
itertools.repeat(elem, times)
itertools.repeat(elem, times)
函数用于创建一个迭代器,该迭代器将不断重复生成 elem
元素,最多重复 times
次。
以下是一个演示 itertools.repeat()
的示例代码:
import itertools
# 使用 repeat 重复生成元素
for i in itertools.repeat(10, 3):
print(i, end=' ')
在这个例子中,itertools.repeat(10, 3)
生成一个重复生成元素 10
的迭代器,总共重复 3
次。结果将是 10 10 10
。
2. 组合生成器
itertools.permutations(iterable, r)
itertools.permutations(iterable, r)
函数用于生成可迭代对象中所有长度为 r
的排列。
以下是一个演示 itertools.permutations()
的示例代码:
import itertools
# 定义一个列表
letters = ['a', 'b', 'c']
# 使用 permutations 生成排列
for perm in itertools.permutations(letters, 2):
print(perm)
在这个示例中,itertools.permutations(letters, 2)
生成了长度为 2
的排列。它会生成由给定列表中元素的所有可能排列组成的迭代器。在此示例中,生成了长度为 2
的排列,例如 ('a', 'b')
, ('a', 'c')
, ('b', 'a')
, ('b', 'c')
, ('c', 'a')
, ('c', 'b')
。
itertools.combinations(iterable, r)
itertools.combinations(iterable, r)
函数用于生成可迭代对象中所有长度为 r
的组合,不考虑元素顺序。
以下是一个演示 itertools.combinations()
的示例代码:
import itertools
# 定义一个列表
letters = ['a', 'b', 'c']
# 使用 combinations 生成组合
for comb in itertools.combinations(letters, 2):
print(comb)
在这个示例中,itertools.combinations(letters, 2)
生成了长度为 2
的组合。它会生成由给定列表中元素的所有可能组合组成的迭代器,不考虑元素的顺序。在此示例中,生成了长度为 2
的组合,例如 ('a', 'b')
, ('a', 'c')
, ('b', 'c')
。
itertools.product(*iterables, repeat=1)
itertools.product(*iterables, repeat=1)
函数用于生成可迭代对象的笛卡尔积,即所有输入可迭代对象中元素的排列组合。
以下是一个演示 itertools.product()
的示例代码:
import itertools
# 定义多个列表
colors = ['red', 'blue']
shapes = ['circle', 'square']
sizes = ['small', 'large']
# 使用 product 生成笛卡尔积
for prod in itertools.product(colors, shapes, sizes):
print(prod)
在这个示例中,itertools.product(colors, shapes, sizes)
生成了多个列表的笛卡尔积。它会生成由给定列表中元素的所有可能排列组成的迭代器。在此示例中,生成了颜色、形状和尺寸的所有可能组合,如 ('red', 'circle', 'small')
, ('red', 'circle', 'large')
, ('red', 'square', 'small')
, 等等。
3. 迭代器的处理
itertools.chain(*iterables)
itertools.chain(*iterables)
函数用于将多个可迭代对象连接成一个迭代器,按照它们在参数中出现的顺序依次输出元素。
以下是一个演示 itertools.chain()
的示例代码:
import itertools
# 定义多个可迭代对象
numbers = [1, 2, 3]
colors = ['red', 'blue']
# 使用 chain 连接多个可迭代对象
merged = itertools.chain(numbers, colors)
# 打印结果
for m in merged:
print(m, end=' ')
在这个示例中,itertools.chain(numbers, colors)
连接了两个列表 numbers
和 colors
。它会将这两个可迭代对象的元素顺序连接起来,以创建一个单一的迭代器。这样,可以按顺序依次输出元素,结果会是 1 2 3 red blue
。
itertools.islice(iterable, stop)
itertools.islice()
函数,从一个迭代器或可迭代对象中获取前 stop
个元素,返回一个生成器来产生这些元素。
下面是一个更加详细的示例代码,说明了 itertools.islice()
的用法:
import itertools
# 定义一个简单的列表
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 使用 islice 获取前 5 个元素
sliced_data = itertools.islice(data, 5)
# 打印结果
print("前 5 个元素:")
for d in sliced_data:
print(d, end=' ')
# 使用 islice 获取索引 2 到 5 之间的元素
sliced_data = itertools.islice(data, 2, 5)
# 打印结果
print("\n\n索引 2 到 5 之间的元素:")
for d in sliced_data:
print(d, end=' ')
# 使用 islice 获取索引 1 到 9 之间,步长为 2 的元素
sliced_data = itertools.islice(data, 1, 9, 2)
# 打印结果
print("\n\n索引 1 到 9 之间,步长为 2 的元素:")
for d in sliced_data:
print(d, end=' ')
这段代码展示了 itertools.islice()
函数的几种用法。它演示了从给定列表中截取出不同范围的元素,包括开始、结束和步长参数。
itertools.filterfalse(predicate, iterable)
itertools.filterfalse()
函数可以返回在给定可迭代对象中,predicate
条件为假的所有元素。
以下是一个演示 itertools.filterfalse()
的示例代码:
import itertools
# 定义一个简单的函数,用于检查奇数
def is_even(x):
return x % 2 == 0
# 定义一个列表
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 使用 filterfalse 选取所有偶数
filtered_data = itertools.filterfalse(is_even, data)
# 打印结果
print("所有奇数:")
for d in filtered_data:
print(d, end=' ')
在这个示例中,定义了一个简单的 is_even()
函数来检查一个数是否为偶数。然后,使用 itertools.filterfalse()
函数从列表中过滤出所有不满足偶数条件的元素。
4. 其他有用的函数
itertools.groupby(iterable, key=None)
itertools.groupby()
函数可以将一个可迭代对象中相邻且相同的元素分组在一起。这个函数返回一个生成器,每个生成器包含一个键和对应的迭代器,这个迭代器生成与该键相同的元素。
以下是一个展示 itertools.groupby()
的示例代码:
import itertools
# 定义一个列表,里面包含重复元素
data = [1, 1, 2, 2, 2, 3, 4, 4, 4, 4, 5]
# 使用 groupby 将相邻且相同的元素分组
grouped_data = itertools.groupby(data)
# 打印结果
print("分组后的元素:")
for key, group in grouped_data:
print(f"键: {key}, 对应的组: {list(group)}")
在这个例子中,itertools.groupby()
函数将相邻且相同的元素分在一组。它检查每个元素,如果相邻元素相同,则将它们放在一组中。
itertools.dropwhile(predicate, iterable)
itertools.dropwhile()
函数是用于过滤可迭代对象的工具。它会丢弃满足特定条件的元素,直到遇到第一个不满足条件的元素,然后返回剩余的元素。一旦遇到第一个不满足条件的元素,后续的元素都将被保留。
以下是一个展示 itertools.dropwhile()
的示例代码:
import itertools
# 定义一个简单的函数,用于检查是否小于5
def less_than_five(x):
return x < 5
# 定义一个列表
data = [1, 3, 5, 2, 4, 6, 7, 8]
# 使用 dropwhile 丢弃满足条件的元素
filtered_data = itertools.dropwhile(less_than_five, data)
# 打印结果
print("不满足条件的元素:")
for d in filtered_data:
print(d, end=' ')
在这个示例中,定义了一个 less_than_five()
函数,用于检查一个数是否小于5。然后,使用 itertools.dropwhile()
函数来从列表中删除所有小于5的元素。
itertools.takewhile(predicate, iterable)
itertools.takewhile()
函数用于从可迭代对象中获取元素,直到遇到不满足指定条件的元素为止。一旦条件不再满足,函数将停止迭代并返回之前满足条件的元素。
以下是一个示例代码,展示了 itertools.takewhile()
函数的用法:
import itertools
# 定义一个简单的函数,用于检查是否小于5
def less_than_five(x):
return x < 5
# 定义一个列表
data = [1, 3, 5, 2, 4, 6, 7, 8]
# 使用 takewhile 选取满足条件的元素
filtered_data = itertools.takewhile(less_than_five, data)
# 打印结果
print("满足条件的元素:")
for d in filtered_data:
print(d, end=' ')
在这个示例中,定义了一个 less_than_five()
函数,用于检查一个数是否小于5。然后,使用 itertools.takewhile()
函数从列表中获取所有满足条件的元素(小于5的元素),直到遇到第一个不满足条件的元素为止。
今天的分享到这里就结束了,更多Python学习内容,http://ipengtao.com/
唉,今年真的太难了。。。
干货笔记整理
100个爬虫常见问题.pdf ,太全了!
Python 自动化运维 100个常见问题.pdf
Python Web 开发常见的100个问题.pdf
124个Python案例,完整源代码!
PYTHON 3.10中文版官方文档
耗时三个月整理的《Python之路2.0.pdf》开放下载
最经典的编程教材《Think Python》开源中文版.PDF下载
点击阅读原文,获取更多学习内容