欢迎访问宙启技术站
智能推送

如何在Python中使用zip函数来同时循环多个列表?

发布时间:2023-06-22 01:09:19

在Python中,zip函数是一个极为方便、重要的内建函数之一。它可以把多个列表或其他可迭代对象打包成一个个元组,然后返回这些元组组成的一个新列表。这样,就可以很方便地并行迭代多个列表(或元组、字符串等)而不需要使用循环和索引操作。

在本文中,我们将首先介绍zip函数的基本用法、原理和注意事项,然后详细讲述如何在Python中使用zip函数来同时循环多个列表。

一、zip的基本用法、原理和注意事项

下面是zip函数的基本用法:

zip(iter1 [,iter2 [...]]) --> zip object

其中,iter1必选,表示 个可迭代对象,后面的iter2等可选,表示第二个、第三个等可迭代对象。zip函数返回一个zip object对象,其中包含每个可迭代对象元素的元组。

下面是一个简单的例子,演示如何使用zip函数:

a = [1, 2, 3]
b = ['a', 'b', 'c']
c = zip(a, b)
print(list(c)) # [(1, 'a'), (2, 'b'), (3, 'c')]

在实际中,zip函数最常见的用途就是循环多个列表。例如,假设我们要使用循环并行迭代两个列表,并打印它们的对应元素,可以使用下面的代码:

a = [1, 2, 3]
b = ['a', 'b', 'c']
for x, y in zip(a, b):
    print(x, y)

这样,每次迭代时,x和y就分别对应a和b中相同位置的元素,打印出它们,输出如下:

1 a
2 b
3 c

需要注意的是,如果传给zip函数的可迭代对象的长度不同,则zip对象的长度等于最短的可迭代对象的长度。例如,如果在上面的a和b基础上新增一个列表d = [4, 5],那么迭代时只会输出三次,因为d的长度为2,比其他容器长度小:

a = [1, 2, 3]
b = ['a', 'b', 'c']
d = [4, 5]
for x, y, z in zip(a, b, d):
    print(x, y, z)
# 输出
# 1 a 4
# 2 b 5

二、如何使用zip函数同时循环多个列表

在Python中,zip函数的最大作用是用来并列操作多个可迭代对象,为常见的业务逻辑提供强大的支持。Zip函数可以应用于多种数据类型,包括列表、元组、字符串等。

下面,我们详细介绍如何使用zip函数来同时循环多个列表。

1. 在循环中使用zip函数

最常见的做法是在for循环中使用zip函数迭代多个列表。例如,假设我们有5个列表,想要在循环中同时迭代它们,可以使用以下代码实现:

a = [1, 2, 3, 4, 5]
b = ['a', 'b', 'c', 'd', 'e']
c = [True, False, True, False, True]
d = [1.1, 2.2, 3.3, 4.4, 5.5]
e = ['spam', 'eggs', 'ham', 'toast', 'bacon']
for w, x, y, z, t in zip(a, b, c, d, e):
    print(w, x, y, z, t)

这样,在每次迭代时,变量w、x、y、z、t就分别对应a、b、c、d、e中相同位置的元素,输出如下:

1 a True 1.1 spam
2 b False 2.2 eggs
3 c True 3.3 ham
4 d False 4.4 toast
5 e True 5.5 bacon

需要注意的是,如果传给zip函数的可迭代对象的长度不同,则zip对象的长度等于最短的可迭代对象的长度。例如,假设在a、b、c、d、e的基础上新增一个元素,如f = [6.6],则在用zip迭代时,只会迭代六次而不是七次:

a = [1, 2, 3, 4, 5]
b = ['a', 'b', 'c', 'd', 'e']
c = [True, False, True, False, True]
d = [1.1, 2.2, 3.3, 4.4, 5.5]
e = ['spam', 'eggs', 'ham', 'toast', 'bacon']
f = [6.6]
for w, x, y, z, t, u in zip(a, b, c, d, e, f):
    print(w, x, y, z, t, u)

这样,在迭代时,只会输出六行结果。

2. 使用zip + *args形式

另外一种实现方式是使用*args参数传递多个列表(或元组、集合等)作为参数传递给zip函数,这样就不需要单独声明多个变量名了。例如:

def print_zip(*args):
    for items in zip(*args):
        print(items)
a = [1, 2, 3]
b = ['a', 'b', 'c']
c = [True, False, True]
print_zip(a, b, c)
# 输出(1, 'a', True)
#     (2, 'b', False)
#     (3, 'c', True)

这样,每次迭代时,items就是zip对象中对应一组元素的元组。由于使用*args传递了多个列表作为参数,所以代码比较灵活,可以方便地迭代不定数量的列表或元组。

3. 使用zip +字典形式

另外一种实现方式是使用字典形式,把多个列表的每一个元素字典化,然后使用循环来打印字典的每个项。例如:

a = ['Tom', 'Mary', 'John']
b = ['IT', 'HR', 'Sales']
c = [25, 28, 32]
for i, j, k in zip(a, b, c):
    print({'Name': i, 'Dept': j, 'Age': k})
# 输出
# {'Name': 'Tom', 'Dept': 'IT', 'Age': 25}
# {'Name': 'Mary', 'Dept': 'HR', 'Age': 28}
# {'Name': 'John', 'Dept': 'Sales', 'Age': 32}

这样,每次迭代时,i、j、k就分别对应a、b、c中相同位置的元素。为了更直接,将i、j、k封装成一个字典,方便打印。

4. 使用enumerate + zip

当我们需要同时循环多个列表,并打印它们的位置时,可以使用enumerate+zip语句来实现。例如:

a = ['Tom', 'Mary', 'John']
b = ['IT', 'HR', 'Sales']
c = [25, 28, 32]
for i, (j, k, l) in enumerate(zip(a, b, c)):
    print(f'{i+1}: {j} in {k}, age {l}')
# 输出
# 1: Tom in IT, age 25
# 2: Mary in HR, age 28
# 3: John in Sales, age 32

这样,每次迭代时,i表示enumerate对象对当前迭代的计数(从1开始),(j, k, l)表示zip对象