4.10 åº�列上索引值è¿ä»£Â¶
问题¶
ä½ æƒ³åœ¨è¿ä»£ä¸€ä¸ªåº�列的å�Œæ—¶è·Ÿè¸ªæ£åœ¨è¢«å¤„ç�†çš„å…ƒç´ ç´¢å¼•ã€‚
解决方案¶
内置的 enumerate() 函数�以很好的解决这个问题:
>>> my_list = ['a', 'b', 'c']
>>> for idx, val in enumerate(my_list):
... print(idx, val)
...
0 a
1 b
2 c
ä¸ºäº†æŒ‰ä¼ ç»Ÿè¡Œå�·è¾“出(行å�·ä»Ž1开始)ï¼Œä½ å�¯ä»¥ä¼ 递一个开始å�‚数:
>>> my_list = ['a', 'b', 'c']
>>> for idx, val in enumerate(my_list, 1):
... print(idx, val)
...
1 a
2 b
3 c
è¿™ç§�æƒ…å†µåœ¨ä½ é��历文件时想在错误消æ�¯ä¸ä½¿ç”¨è¡Œå�·å®šä½�时候é�žå¸¸æœ‰ç”¨ï¼š
def parse_data(filename):
with open(filename, 'rt') as f:
for lineno, line in enumerate(f, 1):
fields = line.split()
try:
count = int(fields[1])
...
except ValueError as e:
print('Line {}: Parse error: {}'.format(lineno, e))
enumerate() 对于跟踪æŸ�些值在列表ä¸å‡ºçŽ°çš„ä½�置是很有用的。
æ‰€ä»¥ï¼Œå¦‚æžœä½ æƒ³å°†ä¸€ä¸ªæ–‡ä»¶ä¸å‡ºçŽ°çš„å�•è¯�æ˜ å°„åˆ°å®ƒå‡ºçŽ°çš„è¡Œå�·ä¸ŠåŽ»ï¼Œå�¯ä»¥å¾ˆå®¹æ˜“的利用 enumerate() æ�¥å®Œæˆ�:
word_summary = defaultdict(list)
with open('myfile.txt', 'r') as f:
lines = f.readlines()
for idx, line in enumerate(lines):
# Create a list of words in current line
words = [w.strip().lower() for w in line.split()]
for word in words:
word_summary[word].append(idx)
å¦‚æžœä½ å¤„ç�†å®Œæ–‡ä»¶å�Žæ‰“å�° word_summary ,会å�‘现它是一个å—å…¸(准确æ�¥è®²æ˜¯ä¸€ä¸ª defaultdict ),
对于�个��有一个 key ,�个 key 对应的值是一个由这个��出现的行�组�的列表。
如果æŸ�个å�•è¯�在一行ä¸å‡ºçŽ°è¿‡ä¸¤æ¬¡ï¼Œé‚£ä¹ˆè¿™ä¸ªè¡Œå�·ä¹Ÿä¼šå‡ºçŽ°ä¸¤æ¬¡ï¼Œ
�时也�以作为文本的一个简�统计。
讨论¶
å½“ä½ æƒ³é¢�外定义一个计数å�˜é‡�的时候,使用 enumerate() å‡½æ•°ä¼šæ›´åŠ ç®€å�•ã€‚ä½ å�¯èƒ½ä¼šåƒ�下é�¢è¿™æ ·å†™ä»£ç �:
lineno = 1
for line in f:
# Process line
...
lineno += 1
但是如果使用 enumerate() 函数æ�¥ä»£æ›¿å°±æ˜¾å¾—æ›´åŠ ä¼˜é›…äº†ï¼š
for lineno, line in enumerate(f):
# Process line
...
enumerate() 函数返回的是一个 enumerate 对象实例,
它是一个è¿ä»£å™¨ï¼Œè¿”回连ç»çš„包å�«ä¸€ä¸ªè®¡æ•°å’Œä¸€ä¸ªå€¼çš„元组,
元组ä¸çš„å€¼é€šè¿‡åœ¨ä¼ å…¥åº�列上调用 next() 返回。
还有一点�能并�很��,但是也值得注�,
æœ‰æ—¶å€™å½“ä½ åœ¨ä¸€ä¸ªå·²ç»�解压å�Žçš„元组åº�列上使用 enumerate() 函数时很容易调入陷阱。
ä½ å¾—åƒ�下é�¢æ£ç¡®çš„æ–¹å¼�è¿™æ ·å†™ï¼š
data = [ (1, 2), (3, 4), (5, 6), (7, 8) ]
# Correct!
for n, (x, y) in enumerate(data):
...
# Error!
for n, x, y in enumerate(data):
...