天天看點

如何快速找到多個字典中的公共鍵(key)

實際案例

德國足球甲級聯賽,每輪球員進球統計(資料為虛構):

  • 第一輪:{‘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)的交集操作:

  1. 使用字典的viewkeys()得到一個字典的keys的集合;
  2. 使用map函數,得到所有字典的keys的集合;
  3. 使用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