Co jsou funkce Python Itertools?

Podle dokumentace Pythonu je Itertools modul Pythonu, který poskytuje sadu rychlých a paměťově efektivních nástrojů pro práci s iterátory Pythonu. Tyto nástroje lze používat samostatně nebo v kombinaci a umožňují stručně a efektivně vytvářet iterátory a pracovat s nimi rychlým a paměťově efektivním způsobem.

Modul Itertools obsahuje funkce, které usnadňují práci s iterátory, zejména při práci s velkými sadami dat. Funkce Itertools mohou pracovat na existujících iterátorech a vytvářet ještě složitější iterátory Pythonu.

Kromě toho mohou Itertools pomoci vývojářům snížit chyby při práci s iterátory a psát čistší, čitelný a udržovatelný kód.

Na základě funkčnosti, kterou poskytují iterátory v modulu Itertools, je lze rozdělit do následujících typů:

#1. Nekonečné iterátory

Jedná se o iterátory, které vám umožňují pracovat s nekonečnými sekvencemi a spouštět smyčku donekonečna, pokud není zadána žádná podmínka, která by smyčku opustila. Takové iterátory jsou užitečné při simulaci nekonečných smyček nebo při generování neomezené sekvence. Itertools má tři nekonečné iterátory, mezi které patří count(), cycle() a repeat().

#2. Kombinatorické iterátory

Kombinatorické iterátory obsahují funkce, které lze použít k práci na kartézských součinech a provádění kombinací a permutací prvků obsažených v iterovatelné. Toto jsou hlavní funkce, když se snažíte najít všechny možné způsoby, jak uspořádat nebo zkombinovat prvky v iterovatelné. Itertools má čtyři kombinatorické iterátory. Jsou to product(), permutations(), combinations() a combinations_with_replacement().

#3. Iterátory končící na nejkratší vstupní sekvenci

Jedná se o ukončovací iterátory, které se používají na konečných sekvencích a generují výstup na základě typu použité funkce. Příklady těchto ukončovacích iterátorů zahrnují: akumulovat(), chain(), chain.from_iterable(), compress(), dropwhile(), filterfalse(), groupby(), islice(), pairwise(), starmap(), takewhile (), tee() a zip_longest().

Podívejme se, jak fungují různé funkce Itertools podle jejich typu:

Nekonečné iterátory

Mezi tři nekonečné iterátory patří:

#1. počet()

Funkce count(start, step) generuje nekonečnou sekvenci čísel počínaje počáteční hodnotou. Funkce má dva volitelné argumenty: start a krok. Argument start nastavuje, kde má posloupnost čísel začínat. Ve výchozím nastavení začíná na 0, pokud není zadána počáteční hodnota. krok nastavuje rozdíl mezi každým po sobě jdoucím číslem. Výchozí hodnota kroku je 1.

import itertools
# count starting at 4, making steps of 2  
for i in itertools.count(4, 2):
    # condition to end the loop avoiding infinite looping
    if i == 14:
        break
    else:
        print(i) # output - 4, 6, 8, 10, 12

Výstup

4
6
8
10
12

#2. cyklus()

Funkce cycle(iterable) bere iterovatelný jako argument a poté cyklicky prochází iterovatelným a umožňuje přístup k položkám v iterovatelném pořadí v pořadí, v jakém se objevují.

Například když projdeme dovnitř [“red”, “green”, “yellow”] do cycle(), v prvním cyklu budeme mít přístup k „červené“; ve druhém cyklu budeme mít přístup k „zelené“, poté „žluté“. Ve čtvrtém cyklu, protože všechny prvky byly v iterovatelném cyklu vyčerpány, začneme znovu na „červené“ a pak budeme pokračovat donekonečna.

Při volání cycle() uložíte jeho výsledek do proměnné, abyste vytvořili iterátor, který zachová svůj stav. Tím je zajištěno, že cyklus nezačíná pokaždé znovu, takže máte přístup pouze k prvnímu prvku.

import itertools

colors = ["red", "green", "yellow"]
# pass in colors into cycle()
color_cycle = itertools.cycle(colors)
print(color_cycle)

# range used to stop the infinite loop once we've printed 7 times
# next() used to return the next item from the iterator
for i in range(7):
    print(next(color_cycle))

Výstup:

red
green
yellow
red
green
yellow
red

#3. opakovat()

repeat(elem,n) má dva argumenty, prvek k opakování (elem) a kolikrát chcete prvek(n) opakovat. Prvek, který chcete opakovat, může být jedna hodnota nebo iterovatelný. Pokud nezadáte n, prvek se bude nekonečně opakovat.

import itertools
   
for i in itertools.repeat(10, 3):
    print(i)

Výstup:

10 
10
10

Kombinatorické iterátory

Mezi kombinatorické iterátory patří:

  8 nejlepších UEM softwaru pro zjednodušení správy IT

#1. produkt()

product() je funkce používaná k výpočtu kartézského součinu iterovatelného prvku, který je jí předán. Pokud máme dvě iterovatelné nebo množiny, například x = {7,8} a ​​y = {1,2,3}, kartézský součin x a y bude obsahovat všechny možné kombinace prvků z x a y, kde první prvek je z x a druhý z y. Kartézský součin x a y v tomto případě je [(7, 1), (7, 2), (7, 3), (8, 1), (8, 2), (8, 3)].

product() přebírá volitelný parametr zvaný repeat, který se používá k výpočtu kartézského součinu iterovatelného se sebou samým. repeat určuje počet opakování pro každý prvek ze vstupních iterable při výpočtu kartézského součinu.

Volání produktu (‚ABCD‘, repeat=2) například poskytuje kombinace jako (‚A‘, ‚A‘), (‚A‘, ‚B‘), (‚A‘, ‚C‘) atd. na. Pokud by bylo opakování nastaveno na 3, funkce by poskytla kombinace jako (‚A‘, ‚A‘, ‚A‘), (‚A‘, ‚A‘, ‚B‘), (‚A‘, ‚A‘ , ‚C‘), (‚A‘, ‚A‘, ‚D‘) a tak dále.

from itertools import product
# product() with the optional repeat argument
print("product() with the optional repeat argument ")
print(list(product('ABC', repeat = 2)))

# product with no repeat
print("product() WITHOUT an optional repeat argument")
print(list(product([7,8], [1,2,3])))

Výstup

product() with the optional repeat argument 
[('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'B'), ('B', 'C'), ('C', 'A'), ('C', 'B'), ('C', 'C')]
product() WITHOUT an optional repeat argument
[(7, 1), (7, 2), (7, 3), (8, 1), (8, 2), (8, 3)]

#2. permutace()

permutations(iterable, group_size) vrátí všechny možné permutace iterovatelného prvku, který mu byl předán. Permutace představuje počet způsobů, jak lze prvky v sadě seřadit. permutations() má volitelný argument group_size. Pokud není zadán group_size, vygenerované permutace budou mít stejnou velikost jako délka iterovatelného předávaného do funkce.

import itertools
numbers = [1, 2, 3]
sized_permutations = list(itertools.permutations(numbers,2))
unsized_permuatations = list(itertools.permutations(numbers))

print("Permutations with a size of 2")
print(sized_permutations)
print("Permutations with NO size argument")
print(unsized_permuatations)

Výstup

Permutations with a group size of 2
[(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]
Permutations with NO size argument
[(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]

#3. kombinace()

combinations(iterable, size) vrací všechny možné kombinace iterovatelného prvku dané délky z prvků v iterovateli předávaných do funkce. Argument velikost určuje velikost každé kombinace.

Výsledky jsou seřazeny. Kombinace se mírně liší od permutací. U permutace na pořadí záleží, ale u kombinace na pořadí nezáleží. Například v [A, B, C] existuje 6 permutací: AB, AC, BA, BC, CA, CB, ale pouze 3 kombinace AB, AC, BC.

import itertools
numbers = [1, 2, 3,4]
size2_combination = list(itertools.combinations(numbers,2))
size3_combination = list(itertools.combinations(numbers, 3))

print("Combinations with a size of 2")
print(size2_combination)
print("Combinations with a size of 3")
print(size3_combination)

Výstup:

Combinations with a size of 2
[(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]
Combinations with a size of 3
[(1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)]

#4. combinations_with_replacement()

combinations_with_replacement(iterovatelný, velikost) generuje všechny možné kombinace iterovatelného prvku dané délky z iterovatelného prvku předaného do funkce a umožňuje opakované prvky ve výstupních kombinacích. Velikost určuje velikost generovaných kombinací.

Tato funkce se liší od combinations() v tom, že poskytuje kombinace, kde se prvek může opakovat více než jednou. Můžete například získat kombinaci, jako je (1,1), kterou nemůžete pomocí kombinace().

import itertools
numbers = [1, 2, 3,4]

size2_combination = list(itertools.combinations_with_replacement(numbers,2))
print("Combinations_with_replacement => size 2")
print(size2_combination)

Výstup

Combinations_with_replacement => size 2
[(1, 1), (1, 2), (1, 3), (1, 4), (2, 2), (2, 3), (2, 4), (3, 3), (3, 4), (4, 4)]

Ukončení iterátorů

To zahrnuje iterátory, jako jsou:

  Jak odstranit hru z Game Center

#1. akumulovat()

akumulovat(iterovatelný, funkce) má iterovatelný a druhý volitelný argument, kterým je funkce. Potom vrátí akumulovaný výsledek aplikace funkce v každé iteraci na prvky v iterovatelném prvku. Pokud není předána žádná funkce, provede se sčítání a vrátí se akumulované výsledky.

import itertools
import operator
numbers = [1, 2, 3, 4, 5]

# Accumulate the sum of numbers
accumulated_val = itertools.accumulate(numbers)
accumulated_mul = itertools.accumulate(numbers, operator.mul)
print("Accumulate with no function")
print(list(accumulated_val))
print("Accumulate with multiplication")
print(list(accumulated_mul))

Výstup:

Accumulate with no function
[1, 3, 6, 10, 15]
Accumulate with multiplication
[1, 2, 6, 24, 120]

#2. řetěz()

chain(iterable_1, iterable_2, …) vezme několik iterovatelných položek a zřetězí je dohromady a vytvoří jednu iterovatelnou obsahující hodnoty z iterovatelných položek předávaných funkci chain()

import itertools

letters = ['A', 'B', 'C', 'D']
numbers = [1, 2, 3]
colors = ['red', 'green', 'yellow']

# Chain letters and numbers together
chained_iterable = list(itertools.chain(letters, numbers, colors))
print(chained_iterable)

Výstup:

['A', 'B', 'C', 'D', 1, 2, 3, 'red', 'green', 'yellow']

#3. chain.from_iterable()

chain.from_iterable(iterable) tato funkce je podobná funkci chain(). Liší se však od řetězce tím, že bere pouze jeden iterovatel obsahující dílčí iterable a spojuje je dohromady.

import itertools

letters = ['A', 'B', 'C', 'D']
numbers = [1, 2, 3]
colors = ['red', 'green', 'yellow']

iterable = ['hello',colors, letters, numbers]
chain = list(itertools.chain.from_iterable(iterable))
print(chain)

Výstup:

['h', 'e', 'l', 'l', 'o', 'red', 'green', 'yellow', 'A', 'B', 'C', 'D', 1, 2, 3]

#4. komprimovat()

Komprimovat(data, selektory) přijímá dva argumenty, data, která jsou iterovatelná, a selektory, což je iterovatelnost, která obsahuje booleovské hodnoty true a false. 1, 0 lze také použít jako alternativy k booleovským hodnotám true a false. compress() pak filtruje předaná data pomocí odpovídajících prvků předávaných v selektoru.

Hodnoty v datech, které odpovídají hodnotě true nebo 1 ve voliči, jsou vybrány, zatímco ostatní, které odpovídají hodnotě false nebo 0, jsou ignorovány. Pokud v selektorech předáte méně booleanů, než je počet položek v datech, všechny prvky za předanými logickými hodnotami v selektorech se ignorují

import itertools

# data has 10 items
data = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J']
# passing in 9 selector items
selectors = [True, False, 1, False, 0, 1, True, False, 1]

# Select elements from data based on selectors
filtered_data = list(itertools.compress(data, selectors))
print(filtered_data)

Výstup:

['A', 'C', 'F', 'G', 'I']

#5. drop while()

dropwhile(funkce, sekvence) přebírá funkci s podmínkou, která vrací true nebo false a posloupnost hodnot. Poté zruší všechny hodnoty, dokud splněná podmínka nevrátí hodnotu False. Jakmile podmínka vrátí hodnotu false, zbytek prvků bude zahrnut do jejích výsledků bez ohledu na to, zda vrátí hodnotu True nebo False.

import itertools

numbers = [1, 2, 3, 4, 5, 1, 6, 7, 2, 1, 8, 9, 0, 7]

# Drop elements until the passed condition is False
filtered_numbers = list(itertools.dropwhile(lambda x: x < 5, numbers))
print(filtered_numbers)

Výstup:

[5, 1, 6, 7, 2, 1, 8, 9, 0, 7]

#6. filterfalse()

filterfalse(funkce, sekvence) přijímá funkci s podmínkou, která se vyhodnotí jako true nebo false, a sekvencí. Potom vrátí hodnoty z posloupnosti, které nesplňují podmínku ve funkci.

import itertools

numbers = [1, 2, 3, 4, 2, 3 5, 6, 5, 8, 1, 2, 3, 6, 2, 7, 4, 3]

# Filter elements for which condition is False
filtered_numbers = list(itertools.filterfalse(lambda x: x < 4, numbers))
print(filtered_numbers)

Výstup:

[4, 5, 6, 5, 8, 6, 7, 4]

#7. skupina vytvořená()

groupby(iterable, key) vezme iterovatelný a klíč, pak vytvoří iterátor, který vrátí po sobě jdoucí klíče a skupiny. Aby to fungovalo, iterovatelný prvek, který je mu předán, musí být seřazen podle stejné klíčové funkce. Funkce klíče počítá klíčovou hodnotu pro každý prvek v iterovatelné.

import itertools

input_list = [("Domestic", "Cow"), ("Domestic", "Dog"), ("Domestic", "Cat"),("Wild", "Lion"), ("Wild", "Zebra"), ("Wild", "Elephant")]
classification = itertools.groupby(input_list,lambda x: x[0])
for key,value in classification:
  print(key,":",list(value))

Výstup:

Domestic : [('Domestic', 'Cow'), ('Domestic', 'Dog'), ('Domestic', 'Cat')]
Wild : [('Wild', 'Lion'), ('Wild', 'Zebra'), ('Wild', 'Elephant')]

#8. islice()

islice(iterovatelný, start, stop, krok) umožňuje rozdělit iterovatelný segment pomocí předaných hodnot start, stop a step. Argument kroku je volitelný. Počítání začíná od 0 a položka na čísle zastávky není zahrnuta.

import itertools

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]

# Select elements within a range
selected_numbers = list(itertools.islice(numbers, 2, 10))
selected_numbers_step= list(itertools.islice(numbers, 2, 10,2))
print("islice without setting a step value")
print(selected_numbers)
print("islice with a step value of 2")
print(selected_numbers_step)

Výstup:

islice without setting a step value
[3, 4, 5, 6, 7, 8, 9, 10]
islice with a step value of 2
[3, 5, 7, 9]

#9. pairwise()

pairwise(iterable) vrací po sobě jdoucí překrývající se páry převzaté z iterovatelné položky v pořadí, v jakém se objevují v iterovatelné. Pokud má předaná iterovatelná hodnota méně než dvě hodnoty, bude výsledek z pairwise() prázdný.

from itertools import pairwise

numbers = [1, 2, 3, 4, 5, 6, 7, 8]
word = 'WORLD'
single = ['A']

print(list(pairwise(numbers)))
print(list(pairwise(word)))
print(list(pairwise(single)))

Výstup:

[(1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8)]
[('W', 'O'), ('O', 'R'), ('R', 'L'), ('L', 'D')]
[]

#10. hvězdná mapa()

starmap(funkce, iterovatelná) je funkce používaná namísto map(), když jsou parametry argumentů již seskupeny do n-tic. startmap() aplikuje funkci na prvky iterovatelného prvku, který je mu předán. Iterovatelný by měl mít prvky seskupené do n-tic.

import itertools

iter_starmap = [(123, 63, 13), (5, 6, 52), (824, 51, 9), (26, 24, 16), (14, 15, 11)]
print (list(itertools.starmap(min, iter_starmap)))

Výstup:

[13, 5, 9, 16, 11]

#11. trvat ()

takewhile(funkce, iterovatelné) funguje opačně než dropwhile(). takewhile() přijímá funkci s podmínkou, která má být vyhodnocena, a iterovatelnou. Poté zahrnuje všechny prvky v iterovatelném prvku, které splňují podmínku ve funkci, dokud není vrácena hodnota False. Jakmile je vrácena hodnota False, všechny následující prvky v iterovatelném prvku jsou ignorovány.

import itertools

numbers = [1, 2, 3, 4, 5, 1, 6, 7, 2, 1, 8, 9, 0, 7]

# Drop elements until the passed condition is False
filtered_numbers = list(itertools.takewhile(lambda x: x < 5, numbers))
print(filtered_numbers)

Výstup:

[1, 2, 3, 4]

#12. tričko()

tee(iterable, n) vezme iterovatelný a vrátí několik nezávislých iterátorů. Počet iterátorů, které se mají vrátit, je nastaven pomocí n, což je ve výchozím nastavení 2.

import itertools

numbers = [1, 2, 3, 4, 5]

# Create two independent iterators from numbers
iter1, iter2 = itertools.tee(numbers, 2)
print(list(iter1))
print(list(iter2))

Výstup:

[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]

#13. zip_longest()

zip_longest(iterables, fillvalue) přijímá několik iterátorů a fillvalue. Poté vrátí iterátor, který agreguje prvky z každého z iterátorů, které mu byly předány. Pokud iterátory nemají stejnou délku, jsou chybějící hodnoty nahrazeny fillvalue předanou funkci, dokud není vyčerpána nejdelší iterovatelná.

import itertools

names = ['John', 'mathew', 'mary', 'Alice', 'Bob', 'Charlie', 'Fury']
ages = [25, 30, 12, 13, 42]

# Combine name and ages, filling in missing ages with a dash
combined = itertools.zip_longest(names, ages, fillvalue="-")

for name, age in combined:
    print(name, age)

Výstup:

John 25
mathew 30
mary 12
Alice 13
Bob 42
Charlie -
Fury -

Závěr

Itertools Pythonu jsou důležitou sadou nástrojů pro vývojáře Pythonu. Itertools Pythonu se široce používají ve funkčním programování, zpracování a transformaci dat, filtrování a výběru dat, seskupování a agregaci, kombinování iterovatelných, kombinatorice a při práci s nekonečnými sekvencemi.

  Jak si vyrobit svůj vlastní Chromebook s Chromium OS

Jako vývojář Pythonu budete mít velký užitek z toho, že se dozvíte o itertools, takže nezapomeňte použít tento článek, abyste se seznámili s Python Itertools.