TOP

算法试题 - 实现公共键查询

题目

查询多个字典中的公共键, 题目实例

每轮比赛 6个人 都有可能得分, 3轮下来都得分的有谁?

每轮比赛 6个人 都有可能得分, n 轮下来都得分的有谁?

解析

思路一

遍历第一轮的记录, 用键来比对二轮,三轮都有此键的情况进行记录

稍微有点啰嗦, 执行效率不是很好, 而且对于 n 的处理也比较麻烦

思路二

利用集合的交集进行便携的查询,

然后使用 map 函数进行将所有轮字典分别转换成一个集合然后集中在一个容器中

然后利用 reduce 函数对这个容器内的所有集合元素进行 &  操作取交集

答案

答案一

import random

res1 = random.sample("abcdefg", random.randint(3, 6))
res2 = random.sample("abcdefg", random.randint(3, 6))
res3 = random.sample("abcdefg", random.randint(3, 6))

s1 = {k: random.randint(1, 3) for k in res1}
s2 = {k: random.randint(1, 3) for k in res2}
s3 = {k: random.randint(1, 3) for k in res3}
print(s1)
print(s2)
print(s3)

l = []
for k in s1:
    if k in s2 and k in s3:
        l.append(k)
print(l)

答案二

import random
from functools import reduce
from pprint import pprint

n = 3
li = []
while n:
    res = random.sample("abcdefg", random.randint(3, 6))
    s = {k: random.randint(1, 3) for k in res}
    li.append(s)
    n -= 1

pprint(li)
"""
[{'a': 3, 'b': 2, 'c': 1, 'd': 3, 'f': 3, 'g': 2},
 {'b': 1, 'c': 2, 'e': 3, 'g': 1},
 {'a': 2, 'c': 3, 'f': 3}]
"""

res = list(map(set, li))
print(res)  # [{'f', 'c', 'b', 'g', 'a', 'd'}, {'e', 'g', 'c', 'b'}, {'f', 'c', 'a'}]

res = reduce(lambda a, b: a & b, res)
print(res)  # {'c'}

 

posted @ 2019-05-14 21:51  羊驼之歌  阅读(105)  评论(0编辑  收藏  举报