详解python itertools功能

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)

运行结果:

说明: 应用实例未提供数据,需要使用具体的日志

后端开发标签