Python, Kutumia zip() kazi: Kupata vitu vya orodha nyingi mara moja

Biashara

Kazi iliyojengwa ndani ya Python zip() inachanganya vipengele vya vitu vingi vinavyoweza kutekelezeka (orodha, nakala, n.k.) na hutumika kupata vipengele vya orodha nyingi katika kitanzi.

Sehemu hii inaelezea matumizi yafuatayo ya chaguo za kukokotoa zip().

  • Pata vipengele vya orodha nyingi kwa kitanzi.
  • Kushughulika na idadi tofauti ya vipengele
    • zip():Chaguo la kukokotoa litapuuza vipengele ambavyo ni vingi sana.
    • itertools.zip_longest():Chaguo hili la kukokotoa litajaza vitu vilivyokosekana.
  • Pata orodha ya nakala za vipengee vya maandishi mengi.

Pata vipengele vya orodha nyingi kwa kitanzi.

Iwapo ungependa kupata na kutumia vipengele vya vitu vingi vinavyoweza kutekelezeka (orodha, nakala, n.k.) kwa wakati mmoja kwenye kitanzi, zibainishe kama hoja za chaguo za kukokotoa 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

Sio mbili tu, lakini tatu au zaidi pia.

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

Kushughulika na idadi tofauti ya vipengele

Kazi ya zip() hupuuza idadi kubwa ya vipengele.

Katika zip() chaguo za kukokotoa, ikiwa idadi ya vipengele katika kila orodha ni tofauti, hadi nambari ndogo (fupi) ya vipengele itarejeshwa, na idadi kubwa zaidi itapuuzwa.

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

Chaguo za kukokotoa za itertools.zip_longest() zitajaza vipengele vinavyokosekana.

Kutumia zip_longest() katika moduli ya kawaida ya itertools ya maktaba, inawezekana kujaza vipengele vilivyokosekana na maadili ya kiholela wakati idadi ya vipengele katika kila orodha ni tofauti.

Kwa chaguo-msingi, imejazwa na Hakuna.

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

Ikiwa hoja ya kujaza thamani imebainishwa, itajazwa na thamani hiyo.

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

Hata kama kuna orodha nyingi zilizo na vipengee ambavyo havipo, thamani ya kujazwa ni sawa. Haiwezekani kutaja maadili tofauti.

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

Inawezekana kubainisha thamani tofauti kwa kutumia zip_longest() ndani zip_longest(), lakini si vitendo kwa sababu unahitaji kujua mapema ni vipengele vipi vya orodha havipo.

Ikiwa unataka kujaza orodha nyingi na idadi isiyojulikana ya vipengele, kila moja yenye thamani tofauti, utaratibu unaofuata unaweza kuzingatiwa.

  1. Bainisha thamani za kujaza kwa orodha zote.
  2. Pata idadi ya juu zaidi ya vipengele
  3. Jaza orodha zote hadi upeo wa idadi ya vipengele
  4. Kwa kutumia zip() kitendakazi
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

Katika mchakato wa kujaza hadi idadi kubwa ya vipengele, tunafanya zifuatazo.

  • Kuanzisha orodha yenye thamani ya kiholela na idadi ya vipengele
  • + mwendeshaji kuunganisha orodha pamoja

Ikiwa tutageuza hii kuwa kazi, inaonekana kama hii. Orodha asili na thamani zinazojaza orodha zimebainishwa kama hoja zinazoweza kuelezeka (orodha au nakala), mtawalia.

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

Inatumia nukuu ya ufahamu wa orodha na upanuzi wa orodha kwa *.

Pata orodha ya nakala za vipengee vya maandishi mengi.

Chaguo za kukokotoa zip() hurejesha kipengee cha kurudisha nyuma (zip kitu) ambacho ni rundo la vipengee vya vitu vingi vinavyoweza kutekelezeka.
Inaweza pia kutumika nje ya kitanzi, na lengwa sio tu kwenye orodha.

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

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

Ikiwa unataka kupata orodha ya vipengee vya vitu vingi vinavyoweza kutekelezeka kama nakala, tumia list() kutengeneza orodha.

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