您的位置:

Python zip(*)函数:多个迭代器并行遍历,解压和重组元素

一、Python zip(*)函数的基本用法

Python中的zip函数可以在同时遍历多个列表时,将对应位置的元素打包成元组。

    list1 = [1, 2, 3]
list2 = ['a', 'b', 'c']
list3 = [4, 5, 6]

zipped = zip(list1, list2, list3)

print(list(zipped))  # [(1, 'a', 4), (2, 'b', 5), (3, 'c', 6)]

zip函数返回一个迭代器,我们可以将其传入list函数,将其转换成列表类型。上述代码将三个列表打包成了一个新的列表,其中新列表中每个元素都是原来三个列表中对应位置上的元素。

zip函数甚至可以接受空的迭代器作为参数,此时不会返回任何元素。

    print(list(zip()))     # []
print(list(zip([], []))) # []

二、Python zip(*)函数的高级应用

1. 解压元组/列表

除了将多个列表打包成元组之外,zip函数还能够将元组/列表进行“解压”,得到原本的多个列表。

    zipped = [(1, 'a', 4), (2, 'b', 5), (3, 'c', 6)]

unzipped = list(zip(*zipped))

print(unzipped)  # [(1, 2, 3), ('a', 'b', 'c'), (4, 5, 6)]

在调用zip函数时,加上了*符号,这个符号用于解包zszip迭代器中的元组,实现“解压”操作。这里使用list函数将返回的迭代器转化成了列表。

需要注意的是,由于unzziped变量是元组,因此我们也可以像下面这样进行操作:

    a, b, c = list(zip(*zipped))

print(a)    # (1, 2, 3)
print(b)    # ('a', 'b', 'c')
print(c)    # (4, 5, 6)

2. 并行遍历多个列表时的高级应用

在Python中,我们经常使用for循环来遍历列表,如下所示:

    for x in my_list:
    # 处理x
...

但是,有时候我们需要同时遍历多个列表,用上述方式会显得很麻烦。而使用zip(*)函数,就可以很方便地实现对多个列表的并行遍历。

假设我们有如下的几个列表:

    names = ['Alice', 'Bob', 'Charlie']
ages = [25, 30, 35]
genders = ['female', 'male', 'male']

我们希望依次输出这些元素:

    Alice is a 25-year-old female.
Bob is a 30-year-old male.
Charlie is a 35-year-old male.

可以使用zip(*)函数进行并行遍历,并使用格式化字符串来实现格式化输出:

    for name, age, gender in zip(names, ages, genders):
    print(f"{name} is a {age}-year-old {gender}.")

这样就可以依次输出需要的结果了。

三、总结

Python中的zip(*)函数可以方便地实现多个迭代器的并行遍历,并且可以将元组/列表进行解压,也可以将多个列表打包成一个新的列表。使用zip(*)函数可以简化代码,并且在并行遍历多个迭代器时特别有用。