如何遍历字典的值集并返回与给定值集匹配的值集的键?

2024-04-29 21:53:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个函数guess,它应该返回与观察值集(arg1)匹配的动物值集(arg2)的键。例如,如果观测集={pet,'fluffy'}和动物词典={cat':{pet,'fluffy','cute'},'dog':{pet'},那么函数应该返回cat的键,因为cat拥有观测集拥有的所有值和set元素。注意,cat还有观察不到的额外值/元素。另外请注意,dog有一个集观测值所具有的值-“pet”-但是,dog没有集观测值所具有的所有值,因此,它不会被返回。你知道吗

这是我目前的职责:

def guess(observations, animals):

    for key, value in animals.items():
        if observations in value:
                 return key

这是一个测试:

guess({'pet', 'fluffy'}, {'cat': {'pet', 'fluffy', 'cute'}, 'dog': {'pet'}})

到目前为止,当我希望函数返回cat时,它返回None。如何查看我的一组观察值是否与一组动物值的集合和/或子集匹配?我的大脑想让我错误地相信,检查观察集是否在值集中是比较集的最佳方法。我也试着遍历我的观察结果,看看它们是否在一组值中。这种方法在一定程度上有效。但是,当我尝试:

for key, value in animals.items():
    for obs in observations:
        if obs in value:
            return key

它返回狗。我很感激任何帮助。谢谢


Tags: key函数in元素forcutevaluecat
3条回答

这个想法是迭代所有潜在的动物,看看观察到的值是否是它们各自属性的子集。我假设有多种动物能满足观察结果。你知道吗

observations = {'pet,' 'fluffy'}
animals = {'cat': {'pet,' 'fluffy', 'cute'}, 'dog': {'pet'}}

def guess(obs, anim):
    ret = []
    for animal, attributes in anim.iteritems():
        if obs <= attributes: # Subset or equality implies this animal qualifies
            ret.append(animal)
    return ret


>>> print guess(observations, animals)
['cat']

在我看来,您正在寻找最佳匹配(最匹配的属性),因此我建议:

def guess(observations, animals):
    return max(list((len(observations & value), key)   # most matches
                    for key, value in animals.items()
                    if observations & value            # if this item had matches
                   ) or                                # if _nothing_ matched
                   [(0, None)]                         # use this
              )[1]                                     # strip off the count

您想知道的是animals中每个项的值是否是observations的超集。谢天谢地,set有一个method来精确地测试它,所以您的函数很简单:

def guess(observations, animals):
    return {k for k, v in animals.items() if v.issuperset(observations)}

请注意,guess()返回一个集合,因为animals中可能有多个符合条件的项:

>>> animals = {'cat': {'pet,' 'fluffy', 'cute'}, 'dog': {'pet'}}
>>> observations = {'pet,' 'fluffy'}
>>> guess(observations, animals)
{'cat'}

也可以使用>=<=运算符作为issupersetissubset(而不是><,它们分别是适当的超集和子集的同义词)。你知道吗

相关问题 更多 >