一、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(*)函数可以简化代码,并且在并行遍历多个迭代器时特别有用。