题目
查询多个字典中的公共键, 题目实例
每轮比赛 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'}