python's docs

1.5.0 寻找dict公共key


1. 随机创建多个dict

# 使用sample取样函数和randint随机数函数创建多个dict
# 在"abcdef"中随机取字母作为key
# 在"1-4"中随机取数字作为value
>>> from random import randint, sample
>>> d1 = {x: randint(1,4) for x in sample("abcdef", randint(3,6))}
>>> d2 = {x: randint(1,4) for x in sample("abcdef", randint(3,6))}
>>> d3 = {x: randint(1,4) for x in sample("abcdef", randint(3,6))}

>>> print d1
{'c': 4, 'b': 4, 'e': 1, 'd': 4, 'f': 3}

>>> print d2
{'b': 3, 'e': 4, 'd': 4}

>>> print d3
{'a': 2, 'c': 1, 'e': 1, 'd': 4, 'f': 4}

2. 获取d1-d3的公共key

1) 方法1-传统判断

# 根据所有的key,进行逐个判断
>>> res = []
>>> for k in 'abcdef':
        if k in d1 and k in d2 and k in d3:
            res.append(k)

>>> print res
['d', 'e']

不用我多说,这个方法太sb

2) 方法2-使用dict.viewkeys方法

# dict.viewkeys会将dict的key转换成一个set,我们可以使用set的交集方法找出公共key
>>> d1.viewkeys() & d2.viewkeys() & d3.viewkeys()
{'d', 'e'}

3) 方法3-获取n个dict的公共key

# 上面的方法是确定有几个dict时,进行的操作,若是多个dict,或者不确定多少个dict时就无法使用上面的方法
# 这里我们使用两个新的函数,map和reduce,关于这两个函数的详细介绍,可以去python官网
# map函数可以将一个list中的元素全部使用一个函数来处理,返回一个list
# reduce函数可以从左向右使用一个函数来处理当前元素和前两个元素被处理的结果之和
# 例如:reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])
#      ((((1+2)+3)+4)+5)
>>> reduce(lambda a, b: a & b, map(dict.viewkeys, [d1, d2, d3]))
{'d', 'e'}