Python, Zip() işlevini kullanma: Birden çok listenin öğelerini aynı anda alma

Python’un yerleşik işlevi zip(), birden çok yinelenebilir nesnenin (listeler, demetler, vb.) öğelerini birleştirir ve bir for döngüsündeki birden çok listenin öğelerini almak için kullanılır.

Bu bölüm, zip() işlevinin aşağıdaki kullanımını açıklar.

  • Bir for döngüsünde birden çok listenin öğelerini alın.
  • Farklı sayıda elemanla uğraşmak
    • zip():İşlev, çok fazla olan öğeleri yok sayar.
    • itertools.zip_longest():Bu işlev eksik öğeleri dolduracaktır.
  • Birden çok yinelenebilir öğenin demetlerinin bir listesini alın.

Bir for döngüsünde birden çok listenin öğelerini alın.

Bir for döngüsünde aynı anda birden çok yinelenebilir nesnenin (listeler, demetler, vb.) öğelerini almak ve kullanmak istiyorsanız, bunları zip() işlevine argüman olarak belirtin.

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

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

Sadece iki değil, üç veya daha fazla.

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

Farklı sayıda elemanla uğraşmak

Zip() işlevi çok sayıda öğeyi yok sayar.

Zip() işlevinde, her listedeki öğe sayısı farklıysa, daha az (daha kısa) sayıda öğe döndürülür ve daha büyük sayı yoksayılır.

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() işlevi, eksik öğeleri dolduracaktır.

Standart kitaplık itertools modülünde zip_longest() kullanılarak, her listedeki öğe sayısı farklı olduğunda eksik öğeleri isteğe bağlı değerlerle doldurmak mümkündür.

Varsayılan olarak, Yok ile doldurulur.

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

Doldurma değeri bağımsız değişkeni belirtilirse, bu değerle doldurulur.

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

Eksik öğeleri olan birden çok liste olsa bile doldurulacak değer aynıdır. Farklı değerler belirtmek mümkün değildir.

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() içinde zip_longest() kullanarak farklı bir değer belirtmek mümkündür, ancak listenin hangi öğelerinin eksik olduğunu önceden bilmeniz gerektiğinden pratik değildir.

Her biri farklı bir değere sahip bilinmeyen sayıda öğeyle birden çok listeyi doldurmak istiyorsanız, aşağıdaki prosedür düşünülebilir.

  1. Tüm listeler için doldurulacak değerleri tanımlayın.
  2. Maksimum sayıda öğe alın
  3. Tüm listeleri maksimum öğe sayısına kadar doldurun
  4. zip() işlevini kullanma
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

En fazla sayıda öğeye kadar doldurma sürecinde aşağıdakileri yaparız.

  • İsteğe bağlı bir değere ve öğe sayısına sahip bir listeyi başlatma
  • + listeleri birleştirmek için operatör

Bunu bir fonksiyona dönüştürürsek, şöyle görünür. Orijinal liste ve listeyi dolduran değerler sırasıyla yinelenebilir (liste veya demet) argümanları olarak belirtilir.

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

Liste anlama gösterimini ve * ile liste genişletmeyi kullanır.

Birden çok yinelenebilir öğenin demetlerinin bir listesini alın.

Zip() işlevi, birden çok yinelenebilir nesnenin öğelerinin bir demeti olan bir yineleyici (zip nesnesi) döndürür.
Ayrıca for döngüsünün dışında da kullanılabilir ve hedef listelerle sınırlı değildir.

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

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

Bir demet olarak birden çok yinelenebilir nesnenin öğelerinin bir listesini almak istiyorsanız, liste yapmak için list() öğesini kullanın.

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