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

时间:2016-10-06 05:44:39

标签: python python-3.x

我有一个函数guess,它应该返回与观察集(arg1)匹配的动物值集(arg2)的键。例如,如果观察集= {'pet,''蓬松'}和动物词典= {'猫':{'宠物,''蓬松','可爱'},'狗':{'宠物'}}然后函数应该返回cat的键,因为cat具有观察集所具有的所有值和设置元素。请注意,cat还有额外的值/元素,观察不会。另请注意,狗具有设定观察值所具有的值之一 - “宠物” - 但是,狗没有观察设置所具有的所有值,因此,它不会被返回。

到目前为止,这是我的功能:

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

它归还狗。我很感激任何帮助。感谢

3 个答案:

答案 0 :(得分: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']

答案 1 :(得分:1)

您想知道的是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的同义词(不是>和{{1} },它们分别是正确的超集和子集的同义词。)

答案 2 :(得分:0)

在我看来,你正在寻找最佳匹配(最匹配的属性),所以我建议:

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