Python itertools

Itertool 是最令人惊叹的 Python 3 标准库之一。这个库有非常酷的功能,可以说它是 Python 编程语言的瑰宝。Python 提供了 itertools 的优秀文档,但是在本教程中,我们将讨论几个重要且有用的 itertools 函数或迭代器。

itertools 的关键之处在于,这个库的功能用于生成内存高效且精确的代码。

在学习 Python itertools 之前,您应该了解 Python 迭代器和生成器。在本文中,我们将描述面向初学者和专业人士的 itertools。

介绍

根据 itertools 的官方定义,“这个模块实现了许多迭代器构建块,灵感来自 APL、Haskell 和 SML ”简而言之,迭代器的数量可以一起创建“迭代器代数”,这使得完成复杂的任务成为可能。itertools 中的函数用于生成更复杂的迭代器。让我们举个例子: Python 内置的 zip()函数接受任意数量的可迭代参数。它迭代元组并返回它们对应的元素。


a = [1,2,3]
b= ['a', 'b', 'c']
c = zip(a,b)
print(c)

输出:

[(1, 'a'), (2, 'b'), (3, 'c')]

在上面的代码中,我们传递了两个列表[1,2,3]和[‘a ‘,’ b ‘,’ c’]作为可在 zip() 函数中迭代的列表。这些列表一次返回一个元素。在 Python 中,实现的元素。iter() 或**。getitem()** 方法称为 iterable。

Python iter()函数用于调用 iterable 并返回 iterable 的迭代器对象。


a = iter('Hello')
print(a)

输出:

<str_iterator object at 0x01505FA0>

Python zip()函数在其每个参数上调用 iter() ,然后通过将结果组合成元组来调用 next()

注意:如果您正在使用 zip()函数和 map()函数,这意味着您已经在使用 itertools。你不需要清楚地导入它。

迭代器的类型

itertools 模块中有各种类型的迭代器。清单如下:

  • 无限迭代器

  • 组合迭代器

  • 终止迭代器

无限迭代器

在 Python 中,任何可以为循环实现的对象都被称为迭代器。列表、元组、集合、字典、字符串是迭代器的例子,但是迭代器也可以是无限的,这种类型的迭代器被称为无限迭代器**。**

无限迭代器

  • count(start, stop):从开始值打印到无穷大。步骤参数是可选的,如果该值被提供给step,那么步数将被跳过。考虑以下示例:


import itertools

for i in itertools.count(10,5):
if i == 50:
break
else:
print(i,end=" ")

输出:

10 15 20 25 30 35 40 45

  • cycle(iterable)::这个迭代器从传递的参数开始按顺序打印所有值。它以循环方式打印值。考虑以下示例:


import itertools
temp = 0
for i in itertools.cycle("123"):
if temp > 7:
break
else:
print(i,end=' ')
temp = temp+1

输出:

1 2 3 1 2 3 1 2 3 1 2

示例- 2:使用 next()功能


import itertools

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

iter = itertools.cycle(val)

for i in range(6):
# Using next function
print(next(iter), end = " ")

输出:

Java T Point Java T Point

  • repeat(val,num) :顾名思义,它无限次重复打印传递的值。 num 参数是可选的。考虑以下示例:


import itertools
print("Printing the number repeadtly:")
print(list(itertools.repeat(40,15)))

输出:

[40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40]

**组合迭代器:**复杂的组合构造被递归生成器简化。排列、组合和笛卡尔乘积是组合构造的例子。

在 Python 中,有四种组合迭代器:

  • Product() - 用于计算可迭代输入的笛卡尔乘积。在这个函数中,我们使用可选的 repeat 关键字参数来计算可迭代函数与其自身的乘积。重复关键词代表重复次数。它以排序元组的形式返回输出。考虑以下示例:


from itertools import product

print("We are computing cartesian product using repeat Keyword Argument:")
print(list(product([1, 2], repeat=2)))
print()

print("We are computing cartesian product of the containers:")
print(list(product(['Java', 'T', 'point'], '5')))
print()

print("We are computing product of the containers:")
print(list(product('CD', [4, 5])))

输出:

Computing cartesian product using repeat Keyword Argument:
[(1, 1), (1, 2), (2, 1), (2, 2)]

Computing cartesian product of the containers:
[('Java', '5'), ('T', '5'), ('point', '5')]

Computing product of the containers:
[('C', 4), ('C', 5), ('D', 4), ('D', 5)]

  • Permutations():用于生成可迭代表的所有可能的置换。每个元素的唯一性取决于它们的位置而不是值。它接受两个论点可重复group_size。如果 group_size 的值为 none 或未指定,那么 group_size 将转换为可迭代的长度。


from itertools import permutations

print("Computing all permutation of the following list")
print(list(permutations([3,"Python"],2)))
print()

print("Permutations of following string")
print(list(permutations('AB')))
print()

print("Permutation of the given container is:")
print(list(permutations(range(4),2)))

输出:

Computing all permutation of the following list
[(3, 'Python'), ('Python', 3)]

Permutations of following string
[('A', 'B'), ('B', 'A')]

Permutation of the given container is:
[(0, 1), (0, 2), (0, 3), (1, 0), (1, 2), (1, 3), (2, 0), (2, 1), (2, 3), (3, 0), (3, 1), (3, 2)]

  • Combinations():用于按排序顺序打印指定组大小中作为参数传递的容器的所有可能组合(不替换)。


from itertools import combinations
print("Combination of list in sorted order(without replacement)",list(combinations(['B',3],2)))
print()

print("Combination of string in sorted order",list(combinations("ZX",2)))
print()

print("Combination of list in sorted order",list(combinations(range(20),1)))

输出:

Combination of list in sorted order(without replacement) [('B', 3)]
Combination of string in sorted order [('Z', 'X')]
Combination of list in sorted order [(0,), (1,), (2,), (3,), (4,), (5,), (6,), (7,), (8,), (9,)]

  • Combination_with_replacement():它接受两个参数,第一个参数是 r 长度的元组,第二个参数是 repeat。它从可迭代的元素中返回长度为 n 的子序列,并重复相同的过程。单独的元素可以在组合中重复出现


from itertools import combinations_with_replacement

print("Combination of string in sorted order(with replacement) is:")
print(list(combinations_with_replacement("XY", 3)))
print()

print("Combination of list in sorted order(with replacement) is:")
print(list(combinations_with_replacement([4, 2], 3)))
print()

print("Combination of container in sorted order(with replacement) is:")
print(list(combinations_with_replacement(range(3), 2)))

输出:

Combination of string in sorted order(with replacement) is:
[('X', 'X', 'X'), ('X', 'X', 'Y'), ('X', 'Y', 'Y'), ('Y', 'Y', 'Y')]

Combination of list in sorted order(with replacement) is:
[(4, 4, 4), (4, 4, 2), (4, 2, 2), (2, 2, 2)]

Combination of container in sorted order(with replacement) is:
[(0, 0), (0, 1), (0, 2), (1, 1), (1, 2), (2, 2)]

终止迭代器

终结迭代器通常用于处理小的输入序列,并根据迭代器中使用的方法的功能生成输出。

有不同类型的终止迭代器:

  • accumulate(iter, func) :它需要两个参数,第一个参数是可迭代的,第二个参数是一个函数,在每次迭代可迭代的值时都会遵循这个函数。如果函数没有在**累加()**迭代器中定义,默认情况下会发生加法。输出变量取决于输入变量;如果输入 iterable 不包含任何值,则输出 iterable 也将为空。


import itertools
import operator

# initializing list 1
list1 = [1, 4, 5, 7, 9, 11]

# using accumulate() that will prints the successive summation of elements
print("The sum is : ", end="")
print(list(itertools.accumulate(list1)))

# using accumulate() that will prints the successive multiplication of elements
print("The product is : ", end="")
print(list(itertools.accumulate(list1, operator.mul)))

# using accumulate() that will prints the successive summation of elements
print("The sum is : ", end="")
print(list(itertools.accumulate(list1)))

# using accumulate() that will prints the successive multiplication of elements
print("The product is : ", end="")
print(list(itertools.accumulate(list1, operator.mul)))

输出:

The sum is : [1, 5, 10, 17, 26, 37]
The product is : [1, 4, 20, 140, 1260, 13860]
The sum is : [1, 5, 10, 17, 26, 37]
The product is : [1, 4, 20, 140, 1260, 13860]

  • chain(iter1,iter2) -用于打印 iterable 中以 chain 形式传递并在参数中声明的所有值。考虑以下示例:


import itertools

# declaring list 1
list1 = [1, 2, 3, 4]

# declaring list 2
list2 = [1, 5, 6, 8]

# declaring list 3
list3 = [9, 10, 11, 12]

# using chain() function that will to print all elements of lists
print("The output is : ", end="")
print(list(itertools.chain(list1, list2, list3)))

输出:

The output is: [1, 2, 3, 4, 1, 5, 6, 8, 9, 10, 11, 12]

  • dropwhile(func,seq) -仅在 func 之后开始打印字符。考虑以下论点:


import itertools
# initializing list
list1 = [2, 4, 5, 7, 8]
# using dropwhile() iterator that will print start displaying after condition is false
print("The output is : ", end="")
print(list(itertools.dropwhile(lambda x: x % 2 == 0, list1)))

输出:

The output is  : [5, 7, 8]

  • filterfalse(func,seq) -我们可以通过它的名称来假设它,因为这个迭代器只打印那些为传递的函数返回 false 的值。考虑以下示例:


import itertools

# declaring list
list1 = [12, 14, 15, 27, 28]

# using filterfalse() iterator that will print false values
print("The Output is: ", end="")
print(list(itertools.filterfalse(lambda x: x % 2 == 0, list1)))

输出:

The Output is : [15, 27]

  • islice(iterable,start,stop,step) -它根据给定的位置对给定的可重复进行切片。它分别接受四个参数,它们是可迭代的、容器的、起始位置的。,结束位置和步骤(可选)。


import itertools
# Declaring list
list1 = [12, 34, 65, 73, 80, 19, 20]
# using islice() iterator that will slice the list acc. to given argument
# starts printing from 3nd index till 8th skipping 2
print("The sliced list values are : ", end="")
print(list(itertools.islice(list1, 2, 8, 2)))

输出:

The sliced list values are : [34, 73, 19]

  • starmap(func, tuple list) -需要两个参数;第一个参数是函数,第二个参数是由元组形式的元素组成的列表。考虑下面的例子。


import itertools

# Declaring list that contain tuple as element
list1 = [(10, 20, 15), (18, 40, 19), (53, 42, 90), (16, 12, 27)]

# using starmap() iterator for selection value acc. to function
# selects max of all tuple values
print("The values acc. to function are : ", end="")
print(list(itertools.starmap(max, list1)))

输出:

The values acc. to function are : [20, 40, 90, 27]

  • takewhile(func,iterable) -这是 **dropwhile()的反方向。**将打印数值,直到返回假状态。考虑以下示例:


import itertools

# Defining a list
list1 = [20, 42, 64, 77, 8, 10, 20]

# takewhile() iterator is used to print values till condition return false.
print("Print until 1st false value returned : ", end="")
print(list(itertools.takewhile(lambda x: x % 2 == 0, list1)))

输出:

The list values until false value return : [20, 42, 64]

  • tee(iterator, count) -它将容器分成多个迭代器,这些迭代器在参数中定义。考虑以下示例:


import itertools

# Declaring list
li = [1, 2, 3, 4, 5, 6, 7]

# storing list in iterator
iti = iter(li)
# using tee() iterator to create a list of iterators
# Creating list of 3 iterators having similar values.
it = itertools.tee(iti, 3)
# It will print object of iterator
print(it)
print("The iterators are : ")
for i in range(0, 2):
print(list(it[i]))

输出:

(<itertools._tee object at 0x01B88D88>, <itertools._tee object at 0x01B88DA8>, <itertools._tee object at 0x01B88BA8>)
The iterators are :
[1, 2, 3, 4, 5, 6, 7]
[1, 2, 3, 4, 5, 6, 7]

  • zip_longest(iterable1, iterable2, fillval) -它按顺序交替打印 iterable 的值。如果其中一个可重复打印所有值,剩余的值将由分配给填充值的值填充。


import itertools
print(" The combined value of iterrables is :")
print(*(itertools.zip_longest('Java', 'Tpoint', fillvalue='_')))

输出:

The combined value of iterables is :
('J', 'T') ('a', 'p') ('v', 'o') ('a', 'i') ('_', 'n') ('_', 't')

在本教程中,我们讨论了几个有用的迭代器和 itertools。

原文:https://www.javatpoint.com/python-itertools