【问题标题】:Find key for two values [closed]查找两个值的键[关闭]
【发布时间】:2019-04-26 17:51:15
【问题描述】:

我需要判断两个值是否具有相同的键。

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

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

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

【问题讨论】:

  • ...["5","8","76"] 的列表与 ["5","8"] 不同 - 遍历字典的值并不是字典的用处...
  • 如果我想找到值 8 的键。这可能吗?
  • "两个值具有相同的键。":您的意思是,找到 两个 值的 dict 项,例如 58 ,在同一个 dict 值内,这里是 "c": ["5", "8", "76"]?阅读Dictionary view objects

标签: python list dictionary compare key-value


【解决方案1】:

您正在寻找子集超集;您的两个值必须一起是字典值的子集。

将您的元组转换为一个集合,然后使用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)]

【讨论】:

  • 更好的解决方案:)
  • 感谢这个简单实用的解决方案!
猜你喜欢
  • 2021-02-07
  • 1970-01-01
  • 1970-01-01
  • 2020-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多