實際案例
- 某班學生期末考試成績,語文、數學和英語分別存儲在3個列表中,同時迭代三個列表,計算每個學生的總分。(并行)
- 某年級有4個班,某次考試每班英語成績分別存儲在4個列表中,依次迭代每個列表,統計全學年成績高于90分人數。(串行)
案例一:
我們看完這個案例是不是首先就想起用索引來解決呢?該方法代碼如下:
# -*- coding: utf-8 -*-
from random import randint
chinese = [randint(50, 100) for _ in xrange(3)]
math = [randint(50, 100) for _ in xrange(3)]
english = [randint(50, 100) for _ in xrange(3)]
for i in xrange(len(chinese)):
sum = chinese[i] + math[i] + english[i]
print i+1, sum
其輸出結果為:
1 234
2 245
3 190
大家有沒有想過,這種方式有個局限性,就是chinese 、math 和english 這些可迭代對象必須是支持這種索引操作的。如果它們為生成器就不支持索引操作,進而無法解決該問題。
這里(并行情況),我們推薦使用內置函數zip,它能將多個可迭代對象合并,每次返回一個元組。該方法代碼如下:
# -*- coding: utf-8 -*-
from random import randint
chinese = [randint(50, 100) for _ in xrange(3)]
math = [randint(50, 100) for _ in xrange(3)]
english = [randint(50, 100) for _ in xrange(3)]
total = []
for c, m, e in zip(chinese, math, english):
total.append(c+m+e)
for i in xrange(len(chinese)):
print i+1, total[i]
其輸出結果為:
1 234
2 245
3 190
案例二(串行):
解決方案:使用標準庫中的itertools.chain,它能將多個可迭代對象連接。該方法代碼如下:
# -*- coding: utf-8 -*-
from itertools import chain
from random import randint
e1 = [randint(50, 100) for _ in xrange(3)]
e2 = [randint(50, 100) for _ in xrange(4)]
e3 = [randint(50, 100) for _ in xrange(6)]
e4 = [randint(50, 100) for _ in xrange(10)]
count = 0
for s in chain(e1, e2, e3, e4):
if s > 90:
count += 1
print count
其運行結果為:
8