Python, með zip() aðgerðinni: Að fá þætti margra lista í einu

Viðskipti

Innbyggða aðgerð Python zip() sameinar þætti margra endurtekinna hluta (listar, tuples, osfrv.) og er notað til að sækja þætti margra lista í for-lykkju.

Þessi hluti lýsir eftirfarandi notkun á zip() aðgerðinni.

  • Fáðu þætti margra lista í for-lykkju.
  • Að takast á við mismunandi fjölda þátta
    • zip():Aðgerðin mun hunsa þá þætti sem eru of mikið.
    • itertools.zip_longest():Þessi aðgerð mun fylla út þá þætti sem vantar.
  • Fáðu lista yfir túllur af þáttum margra endurtekinna.

Fáðu þætti margra lista í for-lykkju.

Ef þú vilt sækja og nota þætti margra endurtekinna hluta (listar, tuples, osfrv.) á sama tíma í for-lykkju, tilgreindu þá sem rök fyrir zip() fallinu.

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

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

Ekki bara tveir, heldur þrír eða fleiri líka.

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

Að takast á við mismunandi fjölda þátta

Zip() fallið hunsar mikinn fjölda þátta.

Í zip() fallinu, ef fjöldi þátta í hverjum lista er mismunandi, verður allt að minni (styttri) fjölda þátta skilað og þeim stærri verður hunsuð.

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

Itertools.zip_longest() fallið mun fylla út þá þætti sem vantar.

Með því að nota zip_longest() í venjulegu itertools-einingunni í bókasafninu er hægt að fylla út þá þætti sem vantar með handahófskenndum gildum þegar fjöldi þátta í hverjum lista er mismunandi.

Sjálfgefið er það fyllt með Engum.

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

Ef fillvalue argumentið er tilgreint verður það fyllt með því gildi.

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

Jafnvel þótt það séu margir listar þar sem þætti vantar er gildið sem á að fylla út einsleitt. Ekki er hægt að tilgreina mismunandi gildi.

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

Það er hægt að tilgreina annað gildi með því að nota zip_longest() inni í zip_longest(), en það er ekki hagkvæmt vegna þess að þú þarft að vita fyrirfram hvaða þætti á listanum vantar.

Ef þú vilt fylla marga lista með óþekktum fjölda þátta, hver með mismunandi gildi, getur eftirfarandi aðferð komið til greina.

  1. Skilgreindu gildi til að fylla út fyrir alla lista.
  2. Fáðu hámarksfjölda þátta
  3. Fylltu alla lista upp í hámarksfjölda þátta
  4. Notaðu zip() aðgerðina
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

Í því ferli að fylla upp að stærsta fjölda þátta gerum við eftirfarandi.

  • Uppsetning á lista með handahófskenndu gildi og fjölda þátta
  • + símafyrirtæki til að tengja lista saman

Ef við breytum þessu í fall lítur þetta svona út. Uppruni listinn og gildin sem fylla listann eru tilgreind sem endurtekin (listi eða tuple) rök, í sömu röð.

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

Það notar listaskilning og stækkun lista með *.

Fáðu lista yfir túllur af þáttum margra endurtekinna.

Zip() aðgerðin skilar endurteknum hlutum (zip hlut) sem er hópur af þáttum margra endurtekinna hluta.
Það er líka hægt að nota það utan for lykkjunnar og markmiðið er ekki takmarkað við lista.

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

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

Ef þú vilt fá lista yfir þætti margra endurtekinna hluta sem tuple, notaðu list() til að búa til lista.

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