在這個問題中,我們期望得到的結果是找到這三輪比賽中,每輪都進球的球員都有誰。下麵用python來模擬一下,先生成一批數據: 如上代碼所示我們生成了三輪比賽的數據,想要得到三輪比賽中,哪位球員在每輪比賽都進球,有這麼幾種方法: 一. 遍歷 這種方法效率不高,並且笨重 二. 與運算 與運算清晰明瞭,利用 ...
在這個問題中,我們期望得到的結果是找到這三輪比賽中,每輪都進球的球員都有誰。下麵用python來模擬一下,先生成一批數據:
>>> from random import randint, sample >>> # sample是取樣的意思,例如sample('abcde', 2),會在'abcde'這個字元串中隨機抽樣2個字元出來 >>> {x: randint(1,3) for x in sample('abcdef', randint(3, 6))} {'a': 2, 'b': 2, 'e': 2, 'd': 3, 'f': 2} >>> # 利用上面的方法生成3輪比賽的數據 >>> s1 = {x: randint(1,3) for x in sample('abcdef', randint(3, 6))} >>> s2 = {x: randint(1,3) for x in sample('abcdef', randint(3, 6))} >>> s3 = {x: randint(1,3) for x in sample('abcdef', randint(3, 6))} >>> # 觀察s1,s2,s3 >>> s1 {'a': 2, 'b': 4, 'f': 1} >>> s2 {'a': 4, 'b': 3, 'e': 2, 'd': 4, 'g': 3, 'f': 4} >>> s3 {'a': 3, 'b': 4, 'e': 2, 'd': 2, 'f': 1}
如上代碼所示我們生成了三輪比賽的數據,想要得到三輪比賽中,哪位球員在每輪比賽都進球,有這麼幾種方法:
一. 遍歷
>>> res = [] >>> for x in s1: >>> if x in s2 and x in s3: >>> res.append() >>> res ['a', 'b', 'f']
這種方法效率不高,並且笨重
二. 與運算
>>> s1.viewkeys() dict_keys(['a', 'b', 'f']) >>> s2.viewkeys() dict_keys(['a', 'b', 'e', 'd', 'g', 'f']) >>> s3.viewkeys() dict_keys(['a', 'b', 'e', 'd', 'f']) >>> s1.viewkeys() & s2.viewkeys() & s3.viewkeys() set(['a', 'b', 'f'])
與運算清晰明瞭,利用了set集合的元素不重覆性質。
三. map與reduce
其實我們利用與運算已經可以比較方便的得到公共鍵了,但是這個問題有一個延伸,如果不止3輪呢?假如有很多很多,或者未知輪(s1,s2,s3...sn),這時就需要引入map和reduce函數了。
這裡只對兩個函數進行簡要介紹,並不完全。
map(f, list)函數接受兩個必要參數,函數f和列表list,返回一個list,該list內的所有元素是參數list中所有元素按照函數f進行計算後的結果。例如:
>>> l = [1,2,3,4,5] >>> map(lambda x: x*x, l) [1,4,9,16,25]
reduce(f, list)函數與map類似,其參數f函數接收兩個參數,並且返回的list內的所有元素是參數list中所有元素按照函數f進行累計計算後的結果,例如累加/累乘:
>>> l = [1,2,3,4,5] >>> reduce(lambda x,y: x+y, l) 15 >>> reduce(lambda x,y: x*y, l) 120
那麼利用這兩個函數,在配合與運算,可以完美解決這個問題:
>>> map(dict.viewkeys, [s1, s2, s3]) [dict_keys(['a', 'b', 'f']), dict_keys(['a', 'b', 'e', 'd', 'g', 'f']), dict_keys(['a', 'b', 'e', 'd', 'f'])] >>> reduce(lambda x,y: x&y, map(dict.viewkeys, [s1, s2, s3])) set(['a', 'b', 'f'])