How do you zip multiple lists in python?

In Python, the built-in function zip[] aggregates multiple iterable objects [lists, tuples, etc.]. You can iterate multiple lists in the for loop with zip[].

  • Built-in Functions - zip[] — Python 3.8.5 documentation

This article describes the following contents.

  • Iterate two, three, or more lists with zip[]
  • In the case that number of elements is different
    • zip[] ignores the extra elements
    • The strict parameter of zip[] [Python3.10 or later]
    • itertools.zip_longest[] fills in the missing elements
  • Get a list of multiple iterable elements

Iterate two, three, or more lists with zip[]

By passing two lists to zip[], you can iterate them in the for loop.

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

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

The same applies not only to two lists but also to three or more lists.

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

You can specify other iterable objects as well as lists.

In the case that number of elements is different

If the number of elements of each iterable object is different, zip[] ignores the extra elements.

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

The strict parameter of zip[] [Python3.10 or later]

The strict parameter was added to zip[] in Python 3.10. Note that it is not available in 3.9 or earlier.

If strict=True, an error is raised if the number of elements is different.

# for name, age in zip[names, ages, strict=True]:
#     print[name, age]
# ValueError: zip[] argument 2 is shorter than argument 1

The default is strict=False, which is the same behavior as up to 3.9, i.e., extra elements are ignored.

itertools.zip_longest[] fills in the missing elements

With itertools.zip_longest[], you can fill the missing elements with any values.

  • itertools.zip_longest[] — Functions creating iterators for efficient looping — Python 3.8.5 documentation

By default, it is filled with 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

You can specify the value to fill in the fillvalue parameter.

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

The value to be filled is uniform even if there are multiple lists with insufficient elements. You cannot specify different values.

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

If you want to fill multiple lists with unknown numbers of elements with different values, follow the procedure below.

  1. Define the value to fill for all lists
  2. Get the maximum number of elements
  3. Fill all lists up to the maximum number of elements
  4. Aggregate with 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

The process of filling the list to the maximum number of elements uses initialization and concatenation of lists.

  • Initialize a list with given size and values in Python
  • Add an item to a list in Python [append, extend, insert]

It can be a function like this:

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

It uses list comprehensions and list unpacking by *.

  • List comprehensions in Python
  • Unpack and pass list, tuple, dict to function arguments in Python

Get a list of multiple iterable elements

zip returns an iterator [zip object] that contains tuple with the elements of multiple iterable objects.

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

z = zip[names, ages]
print[z]
print[type[z]]
# 
# 

It can be converted to a list with list[].

l = list[zip[names, ages]]
print[l]
print[type[l]]
print[type[l[0]]]
# [['Alice', 24], ['Bob', 50], ['Charlie', 18]]
# 
# 

Can you zip multiple lists in Python?

In Python, the built-in function zip[] aggregates multiple iterable objects [lists, tuples, etc.]. You can iterate multiple lists in the for loop with zip[] .

How do I zip multiple files in Python?

Create a zip archive from multiple files in Python Create a ZipFile object by passing the new file name and mode as 'w' [write mode]. It will create a new zip file and open it within ZipFile object. Call write[] function on ZipFile object to add the files in it. call close[] on ZipFile object to Close the zip file.

What happens when you zip two lists in Python?

Here, you create a dictionary that combines the two lists. zip[fields, values] returns an iterator that generates 2-items tuples. If you call dict[] on that iterator, then you'll be building the dictionary you need.

How do I zip a two list with different lengths?

Native way:.
Try to calculate and round the half of the length of first list, if it is float then add 1 too..
Iterate using zip[] before that multiply second YesNo list with the calculated number before..

Chủ Đề