我需要确定两个值是否具有相同的键。
字典看起来像这样,其中的值是列表:
d1 = {"a": ["1", "2"], "c": ["5", "8", "76"], "b": ["3", "9"], "o": ["47"]}
所以我想比较例如(5, 8)
:True
答案 0 :(得分:3)
您正在寻找子集和超集;您的两个值必须一起是字典值的子集。
将元组转换为一组,然后将set.issubset()
与any()
一起使用,以查找字典中是否存在同时包含两个值的值:
test_set = {"5", "8"}
any(test_set.issubset(v) for v in d1.values())
请注意,因为列表中的对象是字符串,所以您也必须在测试集中使用字符串!
在给定数据结构的情况下,使用集与Python一样有效。在内部,test_set.issubset(v)
会将列表转换为一个集合,然后针对该临时集合测试test_set
中的每个元素(每个测试占用固定时间),从而使其成为O(N)线性时间操作。如果您必须多次执行此操作,而性能是一个问题,请考虑使d1
集中的值开始。
作为也接受整数的函数:
def all_same_key(d, *t):
test_set = set(map(str, t))
return any(test_set.issubset(v) for v in d.values())
然后您可以用all_same_key(d1, 5, 8)
进行呼叫。
演示:
>>> all_same_key(d1, 5, 8)
True
>>> all_same_key(d1, 5, 1)
False
>>> all_same_key(d1, 47)
True
如果必须找到键,则对dict.items()
使用列表理解,并过滤其中test_set
是子集的值:
[key for key, value in d1.items() if test_set.issubset(value)]