题目
查询多个字典中的公共键, 题目实例
每轮比赛 6个人 都有可能得分, 3轮下来都得分的有谁?
每轮比赛 6个人 都有可能得分, n 轮下来都得分的有谁?
解析
思路一
遍历第一轮的记录, 用键来比对二轮,三轮都有此键的情况进行记录
稍微有点啰嗦, 执行效率不是很好, 而且对于 n 的处理也比较麻烦
思路二
利用集合的交集进行便携的查询,
然后使用 map 函数进行将所有轮字典分别转换成一个集合然后集中在一个容器中
然后利用 reduce 函数对这个容器内的所有集合元素进行 & 操作取交集
答案
答案一
import randomres1 = 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 randomfrom functools import reducefrom pprint import pprintn = 3li = []while n: res = random.sample("abcdefg", random.randint(3, 6)) s = {k: random.randint(1, 3) for k in res} li.append(s) n -= 1pprint(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'}