查找两个值的键

时间:2018-11-24 12:31:53

标签: python list dictionary compare key-value

我需要确定两个值是否具有相同的键。

字典看起来像这样,其中的值是列表:

d1 = {"a": ["1", "2"], "c": ["5", "8", "76"], "b": ["3", "9"], "o": ["47"]}

所以我想比较例如(5, 8)True

1 个答案:

答案 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)]