问题
你想同时迭代多个序列,每次分别从一个序列中取一个元素。
解决方案
为了同时迭代多个序列,使用 zip() 函数。比如:
1
2
3
4
5
6
7
8
9
10
11
12
|
>>> xpts = [ 1 , 5 , 4 , 2 , 10 , 7 ]
>>> ypts = [ 101 , 78 , 37 , 15 , 62 , 99 ]
>>> for x, y in zip (xpts, ypts):
... print (x,y)
...
1 101
5 78
4 37
2 15
10 62
7 99
>>>
|
zip(a, b) 会生成一个可返回元组 (x, y) 的迭代器,其中x来自a,y来自b。一旦其中某个序列到底结尾,迭代宣告结束。因此迭代长度跟参数中最短序列长度一致。
1
2
3
4
5
6
7
8
9
|
>>> a = [ 1 , 2 , 3 ]
>>> b = [ 'w' , 'x' , 'y' , 'z' ]
>>> for i in zip (a,b):
... print (i)
...
( 1 , 'w' )
( 2 , 'x' )
( 3 , 'y' )
>>>
|
如果这个不是你想要的效果,那么还可以使用 itertools.zip_longest() 函数来代替。比如:
1
2
3
4
5
6
7
8
|
>>> from itertools import zip_longest
>>> for i in zip_longest(a,b):
... print (i)
...
( 1 , 'w' )
( 2 , 'x' )
( 3 , 'y' )
( None , 'z' )
|
1
2
3
4
5
6
7
8
|
>>> for i in zip_longest(a, b, fillvalue = 0 ):
... print (i)
...
( 1 , 'w' )
( 2 , 'x' )
( 3 , 'y' )
( 0 , 'z' )
>>>
|
讨论
当你想成对处理数据的时候 zip() 函数是很有用的。比如,假设你头列表和一个值列表,就像下面这样:
1
2
|
headers = [ 'name' , 'shares' , 'price' ]
values = [ 'ACME' , 100 , 490.1 ]
|
使用zip()可以让你将它们打包并生成一个字典:
1
|
s = dict ( zip (headers,values))
|
或者你也可以像下面这样产生输出:
1
2
|
for name, val in zip (headers, values):
print (name, '=' , val)
|
虽然不常见,但是 zip() 可以接受多于两个的序列的参数。这时候所生成的结果元组中元素个数跟输入序列个数一样。比如;
1
2
3
4
5
6
7
8
9
10
|
>>> a = [ 1 , 2 , 3 ]
>>> b = [ 10 , 11 , 12 ]
>>> c = [ 'x' , 'y' , 'z' ]
>>> for i in zip (a, b, c):
... print (i)
...
( 1 , 10 , 'x' )
( 2 , 11 , 'y' )
( 3 , 12 , 'z' )
>>>
|
最后强调一点就是,zip() 会创建一个迭代器来作为结果返回。如果你需要将结对的值存储在列表中,要使用 list() 函数。比如:
1
2
3
4
5
|
>>> zip (a, b)
< zip object at 0x1007001b8 >
>>> list ( zip (a, b))
[( 1 , 10 ), ( 2 , 11 ), ( 3 , 12 )]
>>>
|
以上就是Python同时迭代多个序列的方法的详细内容,更多关于Python同时迭代多个序列的资料请关注服务器之家其它相关文章!
原文链接:https://www.kancloud.cn/kancloud/python3-cookbook/47202