4.11 å�Œæ—¶è¿ä»£å¤šä¸ªåº�列¶
问题¶
ä½ æƒ³å�Œæ—¶è¿ä»£å¤šä¸ªåº�列,æ¯�次分别从一个åº�列ä¸å�–ä¸€ä¸ªå…ƒç´ ã€‚
解决方案¶
为了å�Œæ—¶è¿ä»£å¤šä¸ªåº�列,使用 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, 2, 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,b):
... print(i)
...
(1, 'w')
(2, 'x')
(3, 'y')
(None, 'z')
>>> for i in zip_longest(a, b, fillvalue=0):
... print(i)
...
(1, 'w')
(2, 'x')
(3, '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, 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() 函数。比如:
>>> zip(a, b)
<zip object at 0x1007001b8>
>>> list(zip(a, b))
[(1, 10), (2, 11), (3, 12)]
>>>