Python, Menggunakan fungsi zip(): Mendapatkan elemen berbilang senarai sekaligus

Perniagaan

Fungsi terbina dalam Python zip() menggabungkan elemen berbilang objek boleh lelar (senarai, tupel, dll.) dan digunakan untuk mendapatkan semula elemen berbilang senarai dalam gelung for.

Bahagian ini menerangkan penggunaan fungsi zip() berikut.

  • Dapatkan elemen berbilang senarai dalam gelung untuk.
  • Berurusan dengan bilangan elemen yang berbeza
    • zip():Fungsi tersebut akan mengabaikan elemen yang terlalu banyak.
    • itertools.zip_longest():Fungsi ini akan mengisi elemen yang hilang.
  • Dapatkan senarai tupel unsur berbilang leterable.

Dapatkan elemen berbilang senarai dalam gelung untuk.

Jika anda ingin mendapatkan semula dan menggunakan elemen berbilang objek boleh lelar (senarai, tupel, dsb.) pada masa yang sama dalam gelung for, nyatakan ia sebagai argumen kepada fungsi 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

Bukan hanya dua, tetapi tiga atau lebih juga.

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

Berurusan dengan bilangan elemen yang berbeza

Fungsi zip() mengabaikan sebilangan besar elemen.

Dalam fungsi zip(), jika bilangan elemen dalam setiap senarai berbeza, sehingga bilangan elemen yang lebih kecil (lebih pendek) akan dikembalikan, dan bilangan yang lebih besar akan diabaikan.

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

Fungsi itertools.zip_longest() akan mengisi elemen yang tiada.

Menggunakan zip_longest() dalam modul perpustakaan standard itertools, adalah mungkin untuk mengisi elemen yang hilang dengan nilai arbitrari apabila bilangan elemen dalam setiap senarai berbeza.

Secara lalai, ia diisi dengan Tiada.

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

Jika argumen fillvalue ditentukan, ia akan diisi dengan nilai tersebut.

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

Walaupun terdapat berbilang senarai dengan unsur yang tiada, nilai yang perlu diisi adalah seragam. Tidak mungkin untuk menentukan nilai yang berbeza.

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

Adalah mungkin untuk menentukan nilai yang berbeza dengan menggunakan zip_longest() di dalam zip_longest(), tetapi ia tidak praktikal kerana anda perlu mengetahui terlebih dahulu unsur-unsur senarai yang tiada.

Jika anda ingin mengisi berbilang senarai dengan bilangan elemen yang tidak diketahui, setiap satu dengan nilai yang berbeza, prosedur berikut boleh dipertimbangkan.

  1. Tentukan nilai untuk diisi untuk semua senarai.
  2. Dapatkan bilangan maksimum elemen
  3. Isikan semua senarai dengan bilangan maksimum elemen
  4. Menggunakan fungsi 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

Dalam proses mengisi sehingga bilangan terbesar elemen, kami melakukan perkara berikut.

  • Memulakan senarai dengan nilai arbitrari dan bilangan elemen
  • + operator untuk menyertai senarai bersama

Jika kita mengubahnya menjadi fungsi, ia kelihatan seperti ini. Senarai asal dan nilai yang mengisi senarai masing-masing ditentukan sebagai argumen iterables (senarai atau 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

Ia menggunakan tatatanda pemahaman senarai dan pengembangan senarai oleh *.

Dapatkan senarai tupel unsur berbilang leterable.

Fungsi zip() mengembalikan iterator (objek zip) yang merupakan tuple elemen berbilang objek boleh lelaran.
Ia juga boleh digunakan di luar gelung for, dan sasaran tidak terhad kepada senarai.

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

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

Jika anda ingin mendapatkan senarai elemen berbilang objek boleh lelar sebagai tuple, gunakan list() untuk membuat senarai.

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