Python 组合迭代器

Python 组合迭代器

在本教程中,我们将学习Python中的组合迭代器。我们知道,迭代器是可迭代对象上的对象,迭代器用于遍历所有可迭代的值。生成器也被称为高级迭代器,但它们无法返回完整的结果,而是产生结果。生成器可以是递归的,就像函数一样。我们将学习itertools模块以及如何获得无限迭代器。我们还将讨论Python迭代器如何终止最短的输入序列。

所以让我们了解Python的itertools模块。

Python Itertools模块

Python的itertools模块提供了创建用于高效循环的迭代器的功能。有多种类型的迭代器,其中一些是无限迭代器,并且一些仅在最短的输入序列上终止。还有一些是组合迭代器。

让我们简单了解一下无限迭代器。

Python中的无限迭代器

顾名思义,无限迭代器可以无限次生成值。有三种类型的无限迭代器,让我们了解以下函数。

  • count([start=0, step=1])

count() 方法接受两个参数 startstep。 start参数从给定的起始数字开始打印并无限打印。step参数是可选的,如果给定步长,给定的数字将被跳过,默认步长为1。让我们理解以下示例。

示例

import itertools

# for in loop
for i in itertools.count(3, 3):
    if i == 36:
        break
    else:
        print(i, end =" ")

输出:

3 6 9 12 15 18 21 24 27 30 33

示例有一个参数

import itertools

# for in loop
for i in itertools.count(3):
    print(i)

输出:

3
6
9
12
15
18
21
Traceback (most recent call last):
  File "d:/Python Project/bubble_sort.py", line 308, in 
    print(i)
KeyboardInterrupt
  • cycle(iterable) –

cycle() 函数按顺序打印所有的值。如果所有可迭代元素都已打印,则从头开始重新打印值。让我们理解以下示例。

示例

import itertools

count = 0

# for in loop
for i in itertools.cycle('ABC'):
    if count > 20:
        break
    else:
        print(i, end = " ")
        count += 1

输出:

A B C A B C A B C A B C A B C A B C A B C

示例

import itertools 
for i in itertools.cycle(['red','green','blue']):

    print(i, end = ' ')

输出:

red green blue red green blue red green blue red green blue red green blue red green blue red green blue red green blue red green 
blue red green blue red green blue red green blue red green blue red green blue
File "d:/Python Project/iterators.py", line 32, in 
    print(i, end = ' ')
KeyboardInterrupt

示例2:使用next()方法

import itertools

list1 = ['Java', 'T', 'Point']

# defining iterator
iterators = itertools.cycle(list1)

# for in loop
for i in range(12):

    # Using next function
    print(next(iterators), end = " ")

输出:

Java T Point Java T Point Java T Point Java T Point
  • repeat(element, num)

它无限次重复打印传递的值。如果给定了可选关键字num,它会重复打印num次数。让我们理解以下示例。

示例

import itertools

print (list(itertools.repeat(100, 20)))

输出:

[100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100]

示例2:

import itertools

for i in itertools.repeat('Blue'):
    print(i, end = ' ')

输出:

Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue 
Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue 
Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue Blue 
Blue Traceback (most recent call last):
  File "d:/Python Project/iterators.py", line 332, in 
    print(i, end = ' ')
KeyboardInterrupt

在这里,我们讨论了无限迭代器的三种方法。现在我们将学习组合迭代器。

组合迭代器

组合迭代器是操作的排列和离散数学元素的选择。它是一种递归生成器,用于简化诸如排列、组合和笛卡尔乘积等组合结构。让我们了解组合迭代器。

  • product(*iterables, repeat=1)

这些迭代器计算输入迭代器的笛卡尔乘积。我们需要指定可选的重复关键字参数以计算可迭代对象与其自身的乘积。它以排序的顺序返回元组。让我们理解以下示例。

示例

from itertools import product

print("The cartesian product using repeat:")
print(list(product([2, 4], repeat=2)))
print()

print("The cartesian product of the containers:")
print(list(product(['Learn', 'from', 'JavaTpoint'], '3')))
print()

print("The cartesian product of the containers:")
print(list(product('AB', [3,4])))

输出:

The cartesian product using repeat:
[(2, 2), (2, 4), (4, 2), (4, 4)]

The cartesian product of the containers:
[('Learn', '3'), ('from', '3'), ('JavaTpoint', '3')]

The cartesian product of the containers:
[('A', 3), ('A', 4), ('B', 3), ('B', 4)]

示例2:

from itertools import product
for i in product('VX','YZ',repeat=3):
                print(i)

输出:

('V', 'Z', 'X', 'Y', 'V', 'Y')
('V', 'Z', 'X', 'Y', 'V', 'Z')
('V', 'Z', 'X', 'Y', 'X', 'Y')
('V', 'Z', 'X', 'Y', 'X', 'Z')
('V', 'Z', 'X', 'Z', 'V', 'Y')
('V', 'Z', 'X', 'Z', 'V', 'Z')
('V', 'Z', 'X', 'Z', 'X', 'Y')
('V', 'Z', 'X', 'Z', 'X', 'Z')
('X', 'Y', 'V', 'Y', 'V', 'Y')
('X', 'Y', 'V', 'Y', 'V', 'Z')
('X', 'Y', 'V', 'Y', 'X', 'Y')
('X', 'Y', 'V', 'Y', 'X', 'Z')
('X', 'Y', 'V', 'Z', 'V', 'Y')
('X', 'Y', 'V', 'Z', 'V', 'Z')
('X', 'Y', 'V', 'Z', 'X', 'Y')
('X', 'Y', 'V', 'Z', 'X', 'Z')
('X', 'Y', 'X', 'Y', 'V', 'Y')
('X', 'Y', 'X', 'Y', 'V', 'Z')
('X', 'Y', 'X', 'Y', 'X', 'Y')
('X', 'Y', 'X', 'Y', 'X', 'Z')
('X', 'Y', 'X', 'Z', 'V', 'Y')
('X', 'Y', 'X', 'Z', 'V', 'Z')
('X', 'Y', 'X', 'Z', 'X', 'Y')
('X', 'Y', 'X', 'Z', 'X', 'Z')
('X', 'Z', 'V', 'Y', 'V', 'Y')
('X', 'Z', 'V', 'Y', 'V', 'Z')
('X', 'Z', 'V', 'Y', 'X', 'Y')
('X', 'Z', 'V', 'Y', 'X', 'Z')
('X', 'Z', 'V', 'Z', 'V', 'Y')
('X', 'Z', 'V', 'Z', 'V', 'Z')
('X', 'Z', 'V', 'Z', 'X', 'Y')
('X', 'Z', 'V', 'Z', 'X', 'Z')
('X', 'Z', 'X', 'Y', 'V', 'Y')
('X', 'Z', 'X', 'Y', 'V', 'Z')
('X', 'Z', 'X', 'Y', 'X', 'Y')
('X', 'Z', 'X', 'Y', 'X', 'Z')
('X', 'Z', 'X', 'Z', 'V', 'Y')
('X', 'Z', 'X', 'Z', 'V', 'Z')
('X', 'Z', 'X', 'Z', 'X', 'Y')
('X', 'Z', 'X', 'Z', 'X', 'Z')

示例3:

from itertools import product
for i in product([1,2,3],[4,5,6]):
                print(i)

输出:

(1, 4)
(1, 5)
(1, 6)
(2, 4)
(2, 5)
(2, 6)
(3, 4)
(3, 5)
(3, 6)

让我们来看另一个示例。

示例4:

from itertools import product
for i in product('UV','WX','YZ'):
        print(i)

输出:

('U', 'W', 'Y')
('U', 'W', 'Z')
('U', 'X', 'Y')
('U', 'X', 'Z')
('V', 'W', 'Y')
('V', 'W', 'Z')
('V', 'X', 'Y')
('V', 'X', 'Z')
  • permutation(iterables*, group_size=None)

permutation() 函数按照词典顺序生成可迭代对象的所有可能排列,并返回唯一元素。它使用元素的位置而不是值。它接受一个可迭代对象和 group_size ;如果 group_size 的值未给出或等于 None ,则 group_size 的值将变为可迭代对象的长度。让我们理解以下示例。

示例

from itertools import permutations

print ("All the permutations is:")
print (list(permutations([1, 'JavaTpoint'], 2)))
print()

print ("All the permutations is:")
print (list(permutations('CD')))
print()

print ("All the permutations is:")
print(list(permutations(range(3), 2)))

输出:

All the permutations is:
[(1, 'JavaTpoint'), ('JavaTpoint', 1)]
All the permutations is:
[('C', 'D'), ('D', 'C')]
All the permutations is:
[(0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (0, 6), (0, 7), (1, 0), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (2, 0), (2, 1), (2, 3), (2, 4), (2, 5), (2, 6), (2, 7), (3, 0), (3, 1), (3, 2), (3, 4), (3, 5), (3, 6), (3, 7), (4, 0), (4, 1), (4, 2), (4, 3), (4, 5), (4, 6), (4, 7), (5, 0), (5, 1), (5, 2), (5, 3), (5, 4), (5, 6), (5, 7), (6, 0), (6, 1), (6, 2), (6, 3), (6, 4), (6, 5), (6, 7), (7, 0), (7, 1), (7, 2), (7, 3), (7, 4), (7, 5), (7, 6)]

示例2:

from itertools import permutations
for i in permutations('ABCD'):
                print(i)

输出:

('A', 'B', 'C', 'D')
('A', 'B', 'D', 'C')
('A', 'C', 'B', 'D')
('A', 'C', 'D', 'B')
('A', 'D', 'B', 'C')
('A', 'D', 'C', 'B')
('B', 'A', 'C', 'D')
('B', 'A', 'D', 'C')
('B', 'C', 'A', 'D')
('B', 'C', 'D', 'A')
('B', 'D', 'A', 'C')
('B', 'D', 'C', 'A')
('C', 'A', 'B', 'D')
('C', 'A', 'D', 'B')
('C', 'B', 'A', 'D')
('C', 'B', 'D', 'A')
('C', 'D', 'A', 'B')
('C', 'D', 'B', 'A')
('D', 'A', 'B', 'C')
('D', 'A', 'C', 'B')
('D', 'B', 'A', 'C')
('D', 'B', 'C', 'A')
('D', 'C', 'A', 'B')
('D', 'C', 'B', 'A')

如上所示,我们在上面的代码中没有传递第二个参数,所以它采用可迭代对象的元组长度。在下面的示例中,我们将3作为长度传递。

示例3:

from itertools import permutations
for i in permutations('ABCD', 3):
                print(i)

输出:

('A', 'B', 'C')
('A', 'B', 'D')
('A', 'C', 'B')
('A', 'C', 'D')
('A', 'D', 'B')
('A', 'D', 'C')
('B', 'A', 'C')
('B', 'A', 'D')
('B', 'C', 'A')
('B', 'C', 'D')
('B', 'D', 'A')
('B', 'D', 'C')
('C', 'A', 'B')
('C', 'A', 'D')
('C', 'B', 'A')
('C', 'B', 'D')
('C', 'D', 'A')
('C', 'D', 'B')
('D', 'A', 'B')
('D', 'A', 'C')
('D', 'B', 'A')
('D', 'B', 'C')
('D', 'C', 'A')
('D', 'C', 'B')
  • combinations(iterable, r)

它以无重复的方式打印出可迭代对象的所有可能组合。它接受一个可迭代的对象和 group_size, 如果没有给出或者等于 None,group_size 的值变为可迭代对象的长度。让我们来理解以下示例。

示例

from itertools import combinations

print ("All the combination is:")
print(list(combinations(['D', 2], 2)))
print()

print ("All the combination is:")
print(list(combinations('ABCD', 2)))
print()

print ("All the combination is:")
print(list(combinations(range(7),1)))

输出:

All the combination is:
[('D', 2)]
All the combination is:
[('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'C'), ('B', 'D'), ('C', 'D')]
All the combination is:
[(0,), (1,), (2,), (3,), (4,), (5,), (6,)]

示例

from itertools import combinations
for i in combinations('ABCD',2):
                print(i)

输出:

('A', 'B')
('A', 'C')
('A', 'D')
('B', 'C')
('B', 'D')
('C', 'D')

再来看一个示例。

示例—

from itertools import combinations

for i in combinations(range(10),3):
                print(i)

输出:

(0, 1, 2)
(0, 1, 3)
(0, 1, 4)
(0, 1, 5)
(0, 1, 6)
(0, 1, 7)
(0, 2, 3)
(0, 2, 4)
(0, 2, 5)
(0, 2, 6)
(0, 2, 7)
(0, 3, 4)
(0, 3, 5)
(0, 3, 6)
(0, 3, 7)
(0, 4, 5)
(0, 4, 6)
(0, 4, 7)
(0, 5, 6)
(0, 5, 7)
(0, 6, 7)
(1, 2, 3)
(1, 2, 4)
(1, 2, 5)
(1, 2, 6)
(1, 2, 7)
(1, 3, 4)
(1, 3, 5)
(1, 3, 6)
(1, 3, 7)
(1, 4, 5)
(1, 4, 6)
(1, 4, 7)
(1, 5, 6)
(1, 5, 7)
(1, 6, 7)
(2, 3, 4)
(2, 3, 5)
(2, 3, 6)
(2, 3, 7)
(2, 4, 5)
(2, 4, 6)
(2, 4, 7)
(2, 5, 6)
(2, 5, 7)
(2, 6, 7)
(3, 4, 5)
(3, 4, 6)
(3, 4, 7)
(3, 5, 6)
(3, 5, 7)
(3, 6, 7)
(4, 5, 6)
(4, 5, 7)
(4, 6, 7)
(5, 6, 7)
  • combinations_with_replacement(iterable, r)

与combination()类似,但可能包括单个元素本身。当n是一个参数,用于确定生成组合的长度时,它会从可迭代对象的元素中返回长度为n的子序列。让我们来看下面的示例。

示例

from itertools import combinations_with_replacement

print ("All the combination is:")
print(list(combinations_with_replacement([1, 2], 2)))
print()

print ("All the combination is:")
print(list(combinations_with_replacement('ABCD', 2)))
print()

print ("All the combination is:")
print(list(combinations_with_replacement(range(7),1)))

输出:

All the combination is:
[(1, 1), (1, 2), (2, 2)]

All the combination is:
[('A', 'A'), ('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'B'), ('B', 'C'), ('B', 'D'), ('C', 'C'), ('C', 'D'), ('D', 'D')]

All the combination is:
[(0,), (1,), (2,), (3,), (4,), (5,), (6,)]

迭代器在最短输入序列上终止

下面是一些重要的方法,也被用作迭代器。让我们理解以下方法。

  • accumulate(iterable, [, func]) –

它用于生成一个累积和的迭代器。换句话说,它累积了指定二元函数的结果。让我们理解以下示例。

示例

from itertools import accumulate
for i in accumulate([2,1,0,1,0,2,3,5]):
            print(i)

输出:

2
3
3
4
4
6
9
14

示例2:

from itertools import accumulate
import operator
for i in accumulate([1, 2, 3, 4, 5, 6, 7, 8, 9, 10],operator.mul):
                print(i)

输出:

1
2
6
24
120
720
5040
40320
362880
3628800
  • chain(*iterables) –

chain()函数逐个迭代给定的可迭代对象。当一个可迭代对象结束时,它会转移到下一个可迭代对象。

示例

from itertools import chain
for i in chain('Hello','World','How are you'):
            print(i)

输出:

H
e
l
l
o
W
o
r
l
d
H
o
w

a
r
e

y
o
u
  • compress(data, selectors) –

它使迭代器成为一个过滤器,并且可以过滤掉选择器值为True的data中的元素。让我们来理解以下示例。

示例

from itertools import compress
for i in compress('ABCDEF',[1,0,1,True,0,' ']):
              print(i)

输出:

A
C
D
F
  • dropwhile(predicate, iterable)

dropwhile()方法在predicate为True时从可迭代对象中删除元素。如果predicate为False,则开始返回每个元素。下面我们来看一个示例。

示例

from itertools import dropwhile
for i in dropwhile(lambda x:x<7,[10,12,67,9,5,39,29,91]):
                print(i)

输出:

10
12
67
9
5
39
29
91

还有很多其他方法,但我们已经讨论了一些基本的方法。

结论

我们已经讨论了Python中的扩展迭代器版本。我们提到了组合迭代器和无限迭代器,这些迭代器在数学运算中非常有帮助。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程