實際案例
德國足球甲級聯賽,每輪球員進球統計(資料為虛構):
- 第一輪:{‘Müller’:1, ‘Robben’:1, ’ Aubameyang’:3, …}
- 第二輪:{‘Lewandowski’:1, ‘Reus’:2, ‘Wagner’:1, …}
- 第三輪:{‘Lewandowski’:2, ‘Aubameyang’:2, ‘Werner’:1, …}
統計出前N輪,每場比賽都有進球的球員。
首先,我們建立一個字典模拟球員進球統計,代碼如下:
# -*- coding: utf-8 -*-
from random import randint, sample
# 第一輪
d1 = {x: randint(, ) for x in sample('abcdefg', randint(, ))}
# 第二輪
d2 = {x: randint(, ) for x in sample('abcdefg', randint(, ))}
# 第三輪
d3 = {x: randint(, ) for x in sample('abcdefg', randint(, ))}
這時,我們有沒有想到一個簡單方法,找到這三個字典中的公共鍵呢?相信大家都會想到這個辦法:從第一個字典中取出每個鍵,周遊第二、三個字典,若鍵相同,則将其添加至清單;反之,繼續周遊,直至第一個字典的鍵全部取出。該方法的代碼如下:
# -*- coding: utf-8 -*-
from random import randint, sample
# 第一輪
d1 = {x: randint(, ) for x in sample('abcdefg', randint(, ))}
# 第二輪
d2 = {x: randint(, ) for x in sample('abcdefg', randint(, ))}
# 第三輪
d3 = {x: randint(, ) for x in sample('abcdefg', randint(, ))}
# 用于存放公共鍵
res = []
for k in d1:
if k in d2 and d3:
res.append(k)
print res
其運作結果為:
['b', 'f']
但若字典個數多了,這種方式是效率就會很低。是以,我們不推薦使用該方法。那有沒有更好的方法解決該問題呢? 答案是肯定的,我們可以使用集合(set)的交集操作:
- 使用字典的viewkeys()得到一個字典的keys的集合;
- 使用map函數,得到所有字典的keys的集合;
- 使用reduce函數,取得所有字典的keys的集合的交集。
代碼如下:
# -*- coding: utf-8 -*-
from random import randint, sample
# 第一輪
d1 = {x: randint(, ) for x in sample('abcdefg', randint(, ))}
# 第二輪
d2 = {x: randint(, ) for x in sample('abcdefg', randint(, ))}
# 第三輪
d3 = {x: randint(, ) for x in sample('abcdefg', randint(, ))}
print reduce(lambda a, b: a & b, map(dict.viewkeys, [d1, d2, d3]))
結果如下:
{'b', 'f'}
簡書個人首頁:http://www.jianshu.com/u/766a46e00f6b