4.12 ä¸�å�Œé›†å�ˆä¸Šå…ƒç´ çš„è¿ä»£Â¶
问题¶
ä½ æƒ³åœ¨å¤šä¸ªå¯¹è±¡æ‰§è¡Œç›¸å�Œçš„æ“�作,但是这些对象在ä¸�å�Œçš„容器ä¸ï¼Œä½ 希望代ç �在ä¸�失å�¯è¯»æ€§çš„æƒ…况下é�¿å…�写é‡�å¤�的循环。
解决方案¶
itertools.chain() 方法�以用�简化这个任务。
它接å�—一个å�¯è¿ä»£å¯¹è±¡åˆ—表作为输入,并返回一个è¿ä»£å™¨ï¼Œæœ‰æ•ˆçš„å±�蔽掉在多个容器ä¸è¿ä»£ç»†èŠ‚ã€‚
为了演示清楚,考虑下é�¢è¿™ä¸ªä¾‹å�:
>>> from itertools import chain
>>> a = [1, 2, 3, 4]
>>> b = ['x', 'y', 'z']
>>> for x in chain(a, b):
... print(x)
...
1
2
3
4
x
y
z
>>>
使用 chain() 的一个常è§�åœºæ™¯æ˜¯å½“ä½ æƒ³å¯¹ä¸�å�Œçš„集å�ˆä¸æ‰€æœ‰å…ƒç´ 执行æŸ�些æ“�作的时候。比如:
# Various working sets of items
active_items = set()
inactive_items = set()
# Iterate over all items
for item in chain(active_items, inactive_items):
# Process item
è¿™ç§�解决方案è¦�比åƒ�下é�¢è¿™æ ·ä½¿ç”¨ä¸¤ä¸ªå�•ç‹¬çš„å¾ªçŽ¯æ›´åŠ ä¼˜é›…ï¼Œ
for item in active_items:
# Process item
...
for item in inactive_items:
# Process item
...
讨论¶
itertools.chain() 接å�—一个或多个å�¯è¿ä»£å¯¹è±¡ä½œä¸ºè¾“å…¥å�‚数。
ç„¶å�Žåˆ›å»ºä¸€ä¸ªè¿ä»£å™¨ï¼Œä¾�次连ç»çš„返回æ¯�个å�¯è¿ä»£å¯¹è±¡ä¸çš„å…ƒç´ ã€‚
è¿™ç§�æ–¹å¼�è¦�比先将åº�列å�ˆå¹¶å†�è¿ä»£è¦�高效的多。比如:
# Inefficent
for x in a + b:
...
# Better
for x in chain(a, b):
...
第一ç§�方案ä¸ï¼Œ a + b æ“�作会创建一个全新的åº�列并è¦�求aå’Œb的类型一致。
chian() ä¸�会有这一æ¥ï¼Œæ‰€ä»¥å¦‚果输入åº�列é�žå¸¸å¤§çš„æ—¶å€™ä¼šå¾ˆçœ�内å˜ã€‚
并且当å�¯è¿ä»£å¯¹è±¡ç±»åž‹ä¸�ä¸€æ ·çš„æ—¶å€™ chain() å�Œæ ·å�¯ä»¥å¾ˆå¥½çš„工作。