Python, zip()-funktion käyttäminen: Usean listan elementtien saaminen kerralla

liiketoiminta

Pythonin sisäänrakennettu funktio zip() yhdistää useiden iteroitavien objektien (listojen, tuplien jne.) elementit ja sitä käytetään useiden listojen elementtien hakemiseen for-silmukassa.

Tässä luvussa kuvataan seuraavat zip()-funktion käyttötavat.

  • Hae useiden listojen elementit for-silmukassa.
  • Eri elementtien lukumäärän käsittely
    • zip():Funktio jättää huomiotta elementit, joita on liikaa.
    • itertools.zip_longest():Tämä toiminto täyttää puuttuvat elementit.
  • Luettelo useiden iterabelien elementtien tupeista.

Hae useiden listojen elementit for-silmukassa.

Jos haluat hakea ja käyttää useiden iteroitavien objektien (listojen, tuplien jne.) elementtejä samaan aikaan for-silmukassa, määritä ne argumentteina funktiolle zip().

names = ['Alice', 'Bob', 'Charlie']
ages = [24, 50, 18]

for name, age in zip(names, ages):
    print(name, age)
# Alice 24
# Bob 50
# Charlie 18

Ei vain kaksi, vaan myös kolme tai enemmän.

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

Eri elementtien lukumäärän käsittely

Funktio zip() jättää huomiotta suuren määrän elementtejä.

Jos zip()-funktiossa kunkin listan elementtien määrä on erilainen, palautetaan pienempi (lyhyempi) määrä elementtejä ja suurempi määrä jätetään huomiotta.

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

Funktio itertools.zip_longest() täydentää puuttuvat elementit.

Käyttämällä standardikirjaston itertools-moduulin zip_longest()-toimintoa on mahdollista täyttää puuttuvat elementit mielivaltaisilla arvoilla, kun kunkin listan elementtien lukumäärä on erilainen.

Oletusarvoisesti se on täytetty arvolla 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

Jos fillvalue-argumentti on määritetty, se täytetään kyseisellä arvolla.

for name, age in zip_longest(names, ages, fillvalue=20):
    print(name, age)
# Alice 24
# Bob 50
# Charlie 18
# Dave 20

Vaikka puuttuvia elementtejä olisi useissa luetteloissa, täytettävä arvo on yhtenäinen. Erilaisia arvoja ei ole mahdollista määrittää.

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

On mahdollista määrittää eri arvo käyttämällä zip_longest()-ohjelmaa zip_longest()-ohjelman sisällä, mutta se ei ole käytännöllistä, koska sinun on tiedettävä etukäteen, mitkä listan elementit puuttuvat.

Jos haluat täyttää useita listoja tuntemattomalla määrällä elementtejä, joista jokaisella on eri arvo, voit käyttää seuraavaa menettelyä.

  1. Määritä kaikille luetteloille täytettävät arvot.
  2. Hae elementtien enimmäismäärä
  3. Täytä kaikki luettelot elementtien enimmäismäärään asti
  4. Käyttämällä zip()-funktiota
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

Täytettäessä elementtejä suurimpaan mahdolliseen määrään asti toimitaan seuraavasti.

  • Luettelon alustaminen mielivaltaisella arvolla ja elementtien lukumäärällä
  • +-operaattori listojen yhdistämiseen

Jos muutamme tämän funktioksi, se näyttää tältä. Alkuperäinen luettelo ja luettelon täyttävät arvot määritetään iterables-argumentteina (luettelo tai tuple).

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

Se käyttää listan ymmärtämisen merkintätapaa ja listan laajentamista *:lla.

Luettelo useiden iterabelien elementtien tupeista.

Funktio zip() palauttaa iteraattorin (zip-olion), joka on useiden iteroitavien objektien elementtien tuple.
Sitä voidaan käyttää myös for-silmukan ulkopuolella, eikä kohde rajoitu vain luetteloihin.

names = ['Alice', 'Bob', 'Charlie']
ages = (24, 50, 18)

z = zip(names, ages)
print(z)
print(type(z))
# <zip object at 0x10b57b888>
# <class 'zip'>

Jos haluat saada listan useiden iteroitavien objektien elementeistä tuplina, käytä list()-toimintoa listan muodostamiseen.

l = list(zip(names, ages))
print(l)
print(type(l))
print(type(l[0]))
# [('Alice', 24), ('Bob', 50), ('Charlie', 18)]
# <class 'list'>
# <class 'tuple'>
Copied title and URL