【问题标题】:How do I iterate through a dictionary's sets of values and return the key of the sets of values that matches a given set?如何遍历字典的值集并返回与给定集匹配的值集的键?
【发布时间】:2016-10-06 05:44:39
【问题描述】:

我有一个函数 guess,它应该返回与观察集 (arg1) 匹配的一组动物值 (arg2) 的键。例如,如果观察集 = {'pet,' 'fluffy'} 并且动物字典 = {'cat': {'pet,' 'fluffy', 'cute'}, 'dog': {'pet '}} 那么函数应该返回 cat 的键,因为 cat 具有观察集所具有的所有值和集合元素。请注意, 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

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

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    想法是遍历所有潜在的动物,看看观察到的值是否是它们各自属性的子集)。我假设可能有多种动物满足观察结果。

    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']
    

    【讨论】:

    • 啊,是的。我忘记了subset 操作。这样更好。
    • 你应该使用&lt;=
    • 谢谢!我不知道如何将观察结果作为一个子集进行比较!
    【解决方案2】:

    你想知道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'}
    

    还可以将&gt;=&lt;= 运算符用作issupersetissubset 的同义词(不是&gt;&lt;,它们是proper 超集的同义词和子集)。

    【讨论】:

      【解决方案3】:

      在我看来,您正在寻找 最佳 匹配项(最匹配的属性),所以我建议这样做:

      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
      

      【讨论】:

        猜你喜欢
        • 2011-10-12
        • 2019-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-22
        • 2021-07-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多