Pythoni sisseehitatud funktsioon zip() ühendab mitme iteratiivse objekti (loendid, tuplid jne) elemendid ja seda kasutatakse mitme loendi elementide väljavõtmiseks for-tsüklis.
Selles jaotises kirjeldatakse funktsiooni zip() järgmist kasutamist.
- Saada mitme loendi elemendid for-tsüklis.
- Erinevate elementide arvuga tegelemine
zip()
:Funktsioon ignoreerib elemendid, mida on liiga palju.itertools.zip_longest()
:See funktsioon täidab puuduvad elemendid.
- Hangib mitme iterables'i elementide tuplite loendi.
Saada mitme loendi elemendid for-tsüklis.
Kui soovite mitme iteratiivse objekti (loendid, tuplid jne) elemente korraga for-silmuses kätte saada ja kasutada, määrake need funktsioonile zip() argumentidena.
names = ['Alice', 'Bob', 'Charlie'] ages = [24, 50, 18] for name, age in zip(names, ages): print(name, age) # Alice 24 # Bob 50 # Charlie 18
Mitte ainult kaks, vaid ka kolm või rohkem.
points = [100, 85, 90] for name, age, point in zip(names, ages, points): print(name, age, point) # Alice 24 100 # Bob 50 85 # Charlie 18 90
Erinevate elementide arvuga tegelemine
Funktsioon zip() ignoreerib suurt arvu elemente.
Funktsioonis zip(), kui elementide arv igas nimekirjas on erinev, tagastatakse kuni väiksema (lühema) arvu elemente ja suuremat arvu ignoreeritakse.
names = ['Alice', 'Bob', 'Charlie', 'Dave'] ages = [24, 50, 18] for name, age in zip(names, ages): print(name, age) # Alice 24 # Bob 50 # Charlie 18
Funktsioon itertools.zip_longest() täidab puuduvad elemendid.
Kasutades standardraamatukogu itertools mooduli zip_longest(), on võimalik täita puuduvad elemendid suvaliste väärtustega, kui elementide arv igas nimekirjas on erinev.
Vaikimisi on see täidetud märkega None.
from itertools import zip_longest names = ['Alice', 'Bob', 'Charlie', 'Dave'] ages = [24, 50, 18] for name, age in zip_longest(names, ages): print(name, age) # Alice 24 # Bob 50 # Charlie 18 # Dave None
Kui on määratud argument fillvalue, täidetakse see selle väärtusega.
for name, age in zip_longest(names, ages, fillvalue=20): print(name, age) # Alice 24 # Bob 50 # Charlie 18 # Dave 20
Isegi kui puuduvate elementidega nimekirju on mitu, on täidetav väärtus ühtne. Erinevaid väärtusi ei ole võimalik määrata.
points = [100, 85] for name, age, point in zip_longest(names, ages, points, fillvalue=20): print(name, age, point) # Alice 24 100 # Bob 50 85 # Charlie 18 20 # Dave 20 20
Võimalik on määrata teistsugune väärtus, kasutades zip_longest() funktsiooni zip_longest() sees, kuid see ei ole praktiline, sest te peate eelnevalt teadma, millised elemendid nimekirjast puuduvad.
Kui soovite täita mitu nimekirja tundmatu arvu elementidega, millest igaühel on erinev väärtus, võib kaaluda järgmist protseduuri.
- Määrake kõikide nimekirjade täitmiseks vajalikud väärtused.
- Saada maksimaalne elementide arv
- Täitke kõik nimekirjad maksimaalse arvu elementideni
- Funktsiooni zip() kasutamine
fill_name = 'XXX' fill_age = 20 fill_point = 50 len_names = len(names) len_ages = len(ages) len_points = len(points) max_len = max(len_names, len_ages, len_points) names = names + [fill_name] * (max_len - len_names) ages = ages + [fill_age] * (max_len - len_ages) points = points + [fill_point] * (max_len - len_points) print(names) print(ages) print(points) # ['Alice', 'Bob', 'Charlie', 'Dave'] # [24, 50, 18, 20] # [100, 85, 50, 50] for name, age, point in zip(names, ages, points): print(name, age, point) # Alice 24 100 # Bob 50 85 # Charlie 18 50 # Dave 20 50
Suurima arvu elementide täitmisel teeme järgmist.
- Loendi initsialiseerimine suvalise väärtuse ja elementide arvuga
- + operaator nimekirjade ühendamiseks
Kui me muudame selle funktsiooniks, näeb see välja nii. Algne loend ja loendi täitvad väärtused on esitatud vastavalt iterables (loendi või tupli) argumentidena.
def my_zip_longest(iterables, fillvalues): max_len = max(len(i) for i in iterables) return zip(*[list(i) + [v] * (max_len - len(i)) for i, v in zip(iterables, fillvalues)]) for name, age, point in my_zip_longest((names, ages, points), ('XXX', 20, 50)): print(name, age, point) # Alice 24 100 # Bob 50 85 # Charlie 18 50 # Dave 20 50
See kasutab loendi mõistmise märkimist ja loendi laiendamist *-ga.
- Seotud artiklid:Pythoni loendi arusaadavuse notatsiooni kasutamine
Hangib mitme iterables'i elementide tuplite loendi.
Funktsioon zip() tagastab iteraatori (zip-objekti), mis on mitme iteratiivse objekti elementide tupel.
Seda saab kasutada ka väljaspool for-tsüklit ja sihtmärk ei ole piiratud nimekirjadega.
names = ['Alice', 'Bob', 'Charlie'] ages = (24, 50, 18) z = zip(names, ages) print(z) print(type(z)) # <zip object at 0x10b57b888> # <class 'zip'>
Kui soovite saada mitme iteratiivse objekti elementide loendi tuplina, kasutage list(), et teha loend.
l = list(zip(names, ages)) print(l) print(type(l)) print(type(l[0])) # [('Alice', 24), ('Bob', 50), ('Charlie', 18)] # <class 'list'> # <class 'tuple'>