Python, zip() функцийг ашиглах: Олон жагсаалтын элементүүдийг нэг дор авах

Бизнес эрхэлдэг

Python-ийн суулгасан функц zip() нь олон давтагдах боломжтой объектын элементүүдийг (жагсаалт, товхимол гэх мэт) нэгтгэдэг бөгөөд олон жагсаалтын элементүүдийг for давталтаас татахад ашигладаг.

Энэ хэсэгт zip() функцийн дараах хэрэглээг тайлбарласан болно.

  • For давталт дахь олон жагсаалтын элементүүдийг авах.
  • Өөр өөр тооны элементүүдтэй харьцах
    • zip():Функц нь хэт их байгаа элементүүдийг үл тоомсорлодог.
    • itertools.zip_longest():Энэ функц нь дутуу элементүүдийг нөхөх болно.
  • Олон давтагдах элементийн багцуудын жагсаалтыг аваарай.

For давталт дахь олон жагсаалтын элементүүдийг авах.

Хэрэв та хэд хэдэн давтагдах боломжтой объектын элементүүдийг (жагсаалт, багц гэх мэт) нэгэн зэрэг for давталтаас татаж авч ашиглахыг хүсвэл тэдгээрийг 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

Зөвхөн хоёр биш, гурав ба түүнээс дээш.

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

Өөр өөр тооны элементүүдтэй харьцах

zip() функц нь олон тооны элементүүдийг үл тоомсорлодог.

zip() функцэд хэрэв жагсаалт бүрийн элементийн тоо өөр байвал бага (богино) хүртэлх тооны элементийг буцаах ба илүү их тоог үл тоомсорлох болно.

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() функц нь дутуу элементүүдийг нөхөх болно.

Стандарт номын сангийн itertools модулийн zip_longest()-г ашигласнаар жагсаалт бүрийн элементийн тоо өөр байх үед дутуу элементүүдийг дурын утгуудаар дүүргэх боломжтой.

Анхдагч байдлаар, энэ нь 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

Хэрэв дүүргэлтийн үнэ цэнийн аргументыг зааж өгсөн бол түүнийг тухайн утгаар дүүргэх болно.

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

Дутуу элементтэй олон жагсаалт байсан ч бөглөх утга нь жигд байна. Өөр өөр утгыг зааж өгөх боломжгүй.

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

zip_longest() дотор zip_longest()-г ашиглан өөр утгыг зааж өгөх боломжтой боловч жагсаалтын аль элемент дутуу байгааг урьдчилан мэдэх шаардлагатай тул энэ нь практик биш юм.

Хэрэв та олон жагсаалтыг үл мэдэгдэх тооны элемент, тус бүр нь өөр өөр утгатай дүүргэхийг хүсвэл дараах процедурыг авч үзэж болно.

  1. Бүх жагсаалтыг бөглөх утгыг тодорхойлно уу.
  2. Элементүүдийн хамгийн их тоог авах
  3. Бүх жагсаалтыг хамгийн их тооны элемент хүртэл бөглөнө үү
  4. zip() функцийг ашиглаж байна
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

Хамгийн олон тооны элементийг дүүргэх явцад бид дараахь зүйлийг хийдэг.

  • Дурын утга, элементийн тоо бүхий жагсаалтыг эхлүүлж байна
  • + жагсаалтад нэгдэх оператор

Хэрэв бид үүнийг функц болгон хувиргавал иймэрхүү харагдах болно. Анхны жагсаалт болон жагсаалтыг дүүргэх утгуудыг тус тусад нь давтагдах аргументууд (жагсаалт эсвэл 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

Энэ нь жагсаалтын ойлголтын тэмдэглэгээ болон жагсаалтын өргөтгөлийг *-ээр ашигладаг.

Олон давтагдах элементийн багцуудын жагсаалтыг аваарай.

zip() функц нь олон давтагдах боломжтой объектуудын элементүүдийн багц болох давталт (zip объект) буцаана.
Үүнийг for циклээс гадуур ашиглаж болох ба зорилтот жагсаалтаар хязгаарлагдахгүй.

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

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

Хэрэв та олон давтагдах боломжтой объектын элементүүдийн жагсаалтыг tuple хэлбэрээр авахыг хүсвэл list()-г ашиглан жагсаалт үүсгэнэ үү.

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