Python, ការប្រើប្រាស់មុខងារ zip()៖ ទទួលបានធាតុនៃបញ្ជីច្រើនក្នុងពេលតែមួយ

អាជីវកម្ម

មុខងារ zip() ភ្ជាប់មកជាមួយរបស់ Python រួមបញ្ចូលគ្នានូវធាតុនៃវត្ថុដែលអាចផ្លាស់ប្តូរបានច្រើន (បញ្ជី, tuples ។ល។) ហើយត្រូវបានប្រើដើម្បីទាញយកធាតុនៃបញ្ជីច្រើននៅក្នុងរង្វិលជុំ។

ផ្នែកនេះពិពណ៌នាអំពីការប្រើប្រាស់មុខងារ zip() ខាងក្រោម។

  • ទទួលបានធាតុនៃបញ្ជីច្រើននៅក្នុងសម្រាប់រង្វិលជុំ។
  • ដោះស្រាយជាមួយនឹងចំនួនផ្សេងគ្នានៃធាតុ
    • zip():មុខងារនឹងមិនអើពើធាតុដែលមានច្រើនពេក។
    • itertools.zip_longest():មុខងារនេះនឹងបំពេញធាតុដែលបាត់។
  • ទទួលបានបញ្ជីនៃ tuples នៃធាតុនៃ iteables ច្រើន។

ទទួលបានធាតុនៃបញ្ជីច្រើននៅក្នុងសម្រាប់រង្វិលជុំ។

ប្រសិនបើអ្នកចង់ទាញយក និងប្រើធាតុនៃវត្ថុដែលអាចធ្វើឡើងវិញបានច្រើន (បញ្ជី, tuples ។ល។) ក្នុងពេលដំណាលគ្នាក្នុងរង្វិលជុំ សូមបញ្ជាក់ពួកវាជាអាគុយម៉ង់ទៅអនុគមន៍ 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() នឹងបំពេញនៅក្នុងធាតុដែលបាត់។

ដោយប្រើ zip_longest() នៅក្នុងម៉ូឌុល itertools បណ្ណាល័យស្តង់ដារ វាគឺអាចធ្វើទៅបានដើម្បីបំពេញធាតុដែលបាត់ជាមួយនឹងតម្លៃបំពាននៅពេលដែលចំនួនធាតុនៅក្នុងបញ្ជីនីមួយៗខុសគ្នា។

តាមលំនាំដើម វាត្រូវបានបំពេញដោយ គ្មាន។

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

វាប្រើការសម្គាល់ការយល់បញ្ជី និងការពង្រីកបញ្ជីដោយ * ។

ទទួលបានបញ្ជីនៃ tuples នៃធាតុនៃ iteables ច្រើន។

អនុគមន៍ zip() ត្រឡប់​វត្ថុ iterator (zip object) ដែល​ជា​ដុំ​នៃ​ធាតុ​នៃ​វត្ថុ​ដែល​អាច​ប្រើ​វា​បាន​ច្រើន។
វាក៏អាចត្រូវបានប្រើនៅខាងក្រៅ for loop ហើយគោលដៅមិនត្រូវបានកំណត់ចំពោះបញ្ជីទេ។

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'>
Copied title and URL