1. 程式人生 > 程式設計 >Python同時迭代多個序列的方法

Python同時迭代多個序列的方法

問題

你想同時迭代多個序列,每次分別從一個序列中取一個元素。

解決方案

為了同時迭代多個序列,使用 zip() 函式。比如:

>>> 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。一旦其中某個序列到底結尾,迭代宣告結束。因此迭代長度跟引數中最短序列長度一致。

>>> a = [1,3]
>>> b = ['w','x','y','z']
>>> for i in zip(a,b):
...   print(i)
...
(1,'w')
(2,'x')
(3,'y')
>>>

如果這個不是你想要的效果,那麼還可以使用 itertools.zip_longest() 函式來代替。比如:

>>> from itertools import zip_longest
>>> for i in zip_longest(a,'y')
(None,'z')
>>> for i in zip_longest(a,b,fillvalue=0):
...   print(i)
...
(1,'y')
(0,'z')
>>>

討論

當你想成對處理資料的時候 zip() 函式是很有用的。比如,假設你頭列表和一個值列表,就像下面這樣:

headers = ['name','shares','price']
values = ['ACME',100,490.1]

使用zip()可以讓你將它們打包並生成一個字典:

s = dict(zip(headers,values))

或者你也可以像下面這樣產生輸出:

for name,val in zip(headers,values):
  print(name,'=',val)

雖然不常見,但是 zip() 可以接受多於兩個的序列的引數。這時候所生成的結果元組中元素個數跟輸入序列個數一樣。比如;

>>> a = [1,3]
>>> b = [10,11,12]
>>> c = ['x',c):
...   print(i)
...
(1,'x')
(2,'y')
(3,12,'z')
>>>

最後強調一點就是,zip() 會建立一個迭代器來作為結果返回。如果你需要將結對的值儲存在列表中,要使用 list() 函式。比如:

>>> zip(a,b)
<zip object at 0x1007001b8>
>>> list(zip(a,b))
[(1,10),(2,11),(3,12)]
>>>

以上就是Python同時迭代多個序列的方法的詳細內容,更多關於Python同時迭代多個序列的資料請關注我們其它相關文章!