假设有一个这样的场景,我们有两个可迭代对象,分别为
[1,2,3]
[4,5,6]
我们想把1和4,2和5,3和6合起来,就像这样
(1,4)
(2,5)
(3,6)
借用zip()函数,我们可以很容易解决这个问题,就像这样
>>> a=[1,2,3]
>>> b=[4,5,6]
>>> c=list(zip(a,b))
>>> c
[(1, 4), (2, 5), (3, 6)]
当然,其实由c我们也可复原a,b
>>> r1,r2=zip(*c)
>>> r1
(1, 2, 3)
>>> r2
(4, 5, 6)
>>> a1=list(r1)
>>> a1
[1, 2, 3]
>>> b1=list(r2)
>>> b1
[4, 5, 6]
当然,这种情况非常简单,下面来看一个复杂的例子,这样更能看到zip函数的强大。
假设我们有这样一些数据:
column_names=['name','salary','iob']
rows=[('jon snow',9900,'CEO'),
('bob',10000,'manager'),
('alice',9800,'scientist')]
但是我们想得到一个字典格式的数据,这样在我们访问时,可以更清晰知道数据的含义。
db=[dict(zip(column_names,row)) for row in rows]
>>> column_names=['name','salary','job']
>>> rows=[('jon snow',9900,'CEO'),
('bob',10000,'manager'),
('alice',9800,'scientist')]
>>> db=[dict(zip(column_names,row)) for row in rows]
>>> db
[{'name': 'jon snow', 'salary': 9900, 'job': 'CEO'}, {'name': 'bob', 'salary': 10000, 'job': 'manager'}, {'name': 'alice', 'salary': 9800, 'job': 'scientist'}]
也许到了这里,你有些疑惑,为什么仅仅在zip()函数外加了个dict(),也就是字典函数,结果就真的成了字典,并且结果就是我们希望的格式。
这里的数据究竟是如何组织的?
事实上,在我们将['name','salary','job'],('jon snow',9900,'CEO')传入zip函数后,数据的格式被转换为这样:[('name','jon snow'),('salary',9900),('job','CEO')],然后再使用转换函数dict(),就成功得到了字典格式的结果。
当然,虽然,我们传入的参数一个是列表,一个是元组,但并没有什么问题,因为zip()函数要求输入对象是可迭代对象就行。