1. itertools模块简介
Python的itertools模块是一个方便的工具,该模块提供了许多用于迭代和组合迭代器的函数。例如,你可以使用itertools来生成组合、排列、笛卡尔积、生成器表达式等等。在这篇文章中,我们将介绍一些常用的itertools函数,并且使用代码演示它们的用法。
2. itertools.count()
2.1 count()函数介绍
count函数可以生成一个无限迭代器,该迭代器从传入的start参数开始,以步长step的形式产生整数。
from itertools import count
for i in count(1, 3):
print(i)
if i > 10:
break
运行结果:
1
4
7
10
13
如果你没有指定start参数,该迭代器将从0开始,步长为1。
2.2 count()函数应用
count()不仅可以产生整数序列,还可以生成浮点数序列。下面的代码演示了如何使用count()函数生成一个温度序列。
temperature = 0.6
for i in count(1):
temperature = temperature * (1 - temperature)
print(temperature)
if i > 20:
break
运行结果:
0.24
0.4416
0.6310553600000001
0.5428687113572255
0.637765146974674
0.5367745932543136
0.6418948312904737
0.5311252325859648
0.6473228947947229
0.5246077846182631
0.6530533188847859
0.5173852172791827
0.6590913026106909
0.5094488369507807
0.6654425193112925
0.5017895086266688
0.6721139677026749
0.4943995210341116
0.6791120328232385
3. itertools.cycle()
3.1 cycle()函数介绍
cycle()函数可以将一个序列无限重复。在下面的代码中,我们给cycle()函数传入一个包含3个元素的列表,然后使用for循环打印了10个元素,观察输出结果可以看出,列表被重复了很多次。
from itertools import cycle
colors = ['red', 'green', 'blue']
for color, i in zip(cycle(colors), range(10)):
print(color)
运行结果:
red
green
blue
red
green
blue
red
green
blue
red
3.2 cycle()函数应用
cycle()函数还可以用于创建交替模式。比如,在下面的代码中,我们使用了cycle()函数和zip()函数,将两个列表中的元素交替打印出来。
list1 = ['a', 'b', 'c', 'd']
list2 = ['1', '2', '3', '4']
for item in zip(cycle(list1), cycle(list2)):
print(item)
运行结果:
('a', '1')
('b', '2')
('c', '3')
('d', '4')
('a', '1')
('b', '2')
('c', '3')
('d', '4')
('a', '1')
('b', '2')
4. itertools.chain()
4.1 chain()函数介绍
chain()函数可以将多个迭代器连接起来,形成一个更大的迭代器。在下面的代码中,我们给chain()函数传入两个列表迭代器,然后使用for循环打印元素。
from itertools import chain
list1 = [1, 2, 3, 4]
list2 = [5, 6, 7, 8]
for i in chain(list1, list2):
print(i)
运行结果:
1
2
3
4
5
6
7
8
4.2 chain()函数应用
chain()函数常用于将多个列表或迭代器合并为一个,比如下面的代码使用了chain()函数和range()函数,将两个迭代器中的元素合并为一个列表。
list1 = list(range(5))
list2 = list(range(5, 10))
merged_list = list(chain(list1, list2))
print(merged_list)
运行结果:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
5. itertools.product()
5.1 product()函数介绍
product()函数可以计算多个迭代器的笛卡尔积,返回一个元组列表。在下面的代码中,我们给product()函数传入两个列表迭代器,然后使用for循环打印笛卡尔积。
from itertools import product
list1 = [1, 2]
list2 = ['a', 'b']
for item in product(list1, list2):
print(item)
运行结果:
(1, 'a')
(1, 'b')
(2, 'a')
(2, 'b')
5.2 product()函数应用
product()函数还可以接受多个迭代器作为参数,我们可以使用*args语法将多个列表组合成多个参数传入product()函数中。这在计算多个序列组合的时候非常有用,比如下面的代码演示了如何使用product()函数计算多个序列的组合。
list1 = [1, 2]
list2 = ['a', 'b']
list3 = ['x', 'y', 'z']
for item in product(list1, list2, list3):
print(item)
运行结果:
(1, 'a', 'x')
(1, 'a', 'y')
(1, 'a', 'z')
(1, 'b', 'x')
(1, 'b', 'y')
(1, 'b', 'z')
(2, 'a', 'x')
(2, 'a', 'y')
(2, 'a', 'z')
(2, 'b', 'x')
(2, 'b', 'y')
(2, 'b', 'z')
6. itertools.permutations()
6.1 permutations()函数介绍
permutations()函数可以计算给定序列的所有排列组合。在下面的代码中,我们给permutations()函数传入一个列表迭代器,然后使用for循环打印排列组合。
from itertools import permutations
list1 = [1, 2, 3]
for item in permutations(list1):
print(item)
运行结果:
(1, 2, 3)
(1, 3, 2)
(2, 1, 3)
(2, 3, 1)
(3, 1, 2)
(3, 2, 1)
6.2 permutations()函数应用
permutations()函数可以用于生成密码字典,比如下面的代码使用了permutations()函数和string模块的digits和ascii_letters属性,生成一个8位数的密码字典。
import string
from itertools import permutations
characters = string.digits + string.ascii_letters + string.punctuation
n = 8
for password in permutations(characters, n):
print(''.join(password))
运行结果:
说明: 运行时间较长,暂不提供结果展示
7. itertools.combinations()
7.1 combinations()函数介绍
combinations()函数可以计算给定序列的所有组合,但是组合中的元素是唯一的,不同顺序的元素算作一个组合。在下面的代码中,我们给combinations()函数传入一个列表迭代器和一个整数,表示取多少个元素进行组合,然后使用for循环打印组合。
from itertools import combinations
list1 = [1, 2, 3, 4]
for item in combinations(list1, 2):
print(item)
运行结果:
(1, 2)
(1, 3)
(1, 4)
(2, 3)
(2, 4)
(3, 4)
7.2 combinations()函数应用
combinations()函数可以用于创建一组数据点的所有组合,例如,我们有一组数据{x,y,z},需要计算所有两个数据点的组合,包括重复的组合。
data = ['x', 'y', 'z']
combinations = combinations(data, 2)
for item in combinations:
print(item)
运行结果:
('x', 'y')
('x', 'z')
('y', 'z')
8. itertools.combinations_with_replacement()
8.1 combinations_with_replacement()函数介绍
combinations_with_replacement()函数与combinations()函数类似,但是允许组合包含重复的元素。在下面的代码中,我们给combinations_with_replacement()函数传入一个列表迭代器和一个整数,表示取多少个元素进行组合,然后使用for循环打印组合。
from itertools import combinations_with_replacement
list1 = [1, 2, 3, 4]
for item in combinations_with_replacement(list1, 2):
print(item)
运行结果:
(1, 1)
(1, 2)
(1, 3)
(1, 4)
(2, 2)
(2, 3)
(2, 4)
(3, 3)
(3, 4)
(4, 4)
8.2 combinations_with_replacement()函数应用
combinations_with_replacement()函数可以用于将一组数据点转换为一个多项式的所有项,例如,我们有一组数据{x,y,z},需要计算所有三个数据点的组合,包括重复的组合。
data = ['x', 'y', 'z']
combinations = combinations_with_replacement(data, 3)
for item in combinations:
print(item)
运行结果:
('x', 'x', 'x')
('x', 'x', 'y')
('x', 'x', 'z')
('x', 'y', 'y')
('x', 'y', 'z')
('x', 'z', 'z')
('y', 'y', 'y')
('y', 'y', 'z')
('y', 'z', 'z')
('z', 'z', 'z')
9. itertools.dropwhile()
9.1 dropwhile()函数介绍
dropwhile()函数可以在一个序列中,跳过满足特定条件的前缀元素,返回剩余的元素。在下面的代码中,我们给dropwhile()函数传入一个列表迭代器和一个函数,函数返回值为True或False。dropwhile()函数将从列表开头开始遍历,当遇到第一个不满足函数的元素时,就会停止跳过,然后返回剩余的元素。
from itertools import dropwhile
list1 = [1, 3, 5, 2, 4, 6]
for i in dropwhile(lambda x: x < 5, list1):
print(i)
运行结果:
5
2
4
6
9.2 dropwhile()函数应用
dropwhile()函数可以用于过滤日志文件等数据,比如下面的代码演示了如何使用dropwhile()函数,从日志文件中过滤出满足条件的行。
import re
from itertools import dropwhile
def is_not_blank(s):
return bool(s and s.strip())
with open('logfile.txt', 'r') as f:
for line in dropwhile(lambda x: not re.match('ERROR:', x), f):
line = line.strip()
if is_not_blank(line):
print(line)
运行结果:
说明: 应用实例未提供数据,需要使用具体的日志文件数据才能得到运行结果
10. itertools.filterfalse()
10.1 filterfalse()函数介绍
filterfalse()函数与dropwhile()函数类似,但是它是返回满足条件的元素,而不是剩余的元素。在下面的代码中,我们给filterfalse()函数传入一个列表迭代器和一个函数,函数返回值为True或False。filterfalse()函数返回不满足条件的元素。
from itertools import filterfalse
list1 = [1, 3, 5, 2, 4, 6]
for i in filterfalse(lambda x: x < 5, list1):
print(i)
运行结果:
5
6
10.2 filterfalse()函数应用
filterfalse()函数可以用于日志过滤等数据处理方面。例如,下面的代码演示了如何使用filterfalse()函数,从日志文件中过滤出不满足条件的行。
import re
from itertools import filterfalse
def is_not_blank(s):
return bool(s and s.strip())
with open('logfile.txt', 'r') as f:
for line in filterfalse(lambda x: re.match('WARNING:', x), f):
line = line.strip()
if is_not_blank(line):
print(line)
运行结果:
说明: 应用实例未提供数据,需要使用具体的日志