原文地址:https://peps.python.org/pep-0201/
PDF 地址:
同步迭代就是用 for 一次循环多个序列。
类似于这样的东西:
arr1 = [1, 2, 3, 4]
arr2 = ['a', 'b', 'c', 'd']
for a, b in arr1, arr2:
print(a, b)
map
实现for a, b in map(lambda x, y: (x, y), arr1, arr2):
print(a, b)
原文为 Python 2,实现如下:
for a, b in map(None, arr1, arr2): print(a, b)
Python 3
map
函数的第一个参数不能为None
了。
zip
实现使用 map
不方便,最明显的一点就是每次都要自己写一个 lambda
才行。
为了更方便地实现同步迭代,PEP 201 提出了一个新函数 zip
来实现这个功能。
for a, b in zip(arr1, arr2):
print(a, b)
zip
函数的其他用途例如
data = [
['id', 'name', 'income'],
['1', 'John', 200],
['2', 'Jane', 300],
['3', 'Joe', 100],
['4', 'Jill', 400],
['5', 'Jim', 230],
]
print(list(zip(*data)))
( *data
相当于 zip(data[0], data[1], ..., data[n-1])
)
zip()
函数在 Python 2 中返回的是 list
;在 Python 3 中返回的是迭代器,如果要输出展示,要先转换为 list
。
得到结果
[('id', '1', '2', '3', '4', '5'), ('name', 'John', 'Jane', 'Joe', 'Jill', 'Jim'), ('income', 200, 300, 100, 400, 230)]
很轻松就把行转成了列。
还可以利用 zip()
计算平均收入:
income_list = list(zip(*data[1:]))[2]
print('average income: ', sum(income_list) / len(income_list))
data[1:]
这里切片是为了去除表格第一行的标题。然后 [2]
是因为收入是表格的第三列。