繁体   English   中英

检查字典是否是另一个具有键值对的字典的子集

[英]Check if a Dictionary is a Subset of another Dictionary with Key Value pairs

我有两个字典资源和 available_resources:

resources = {'B': 1, 's': 2, 't': 3, 'e': 3, '!': 1, 'h': 1, 'i': 1, ' ': 3, 'o': 1, 'g': 1, 'E': 1, 'A': 1, 'x': 2, 'p': 1, 'l': 1, 'r': 1}


available_resources = {'A': 1, 'l': 1, 'g': 1, 'o': 1, 'E': 1, 'x': 1, 'p': 1, 'e': 3, 'r': 1, 't': 3, ' ': 3, 'i': 1, 's': 2, 'h': 1, 'B': 1, '!': 1}

我想检查资源是否是 available_resources 的子集(如果字典中包含的每个元素都是 <= 资源字典中的相应值条目)

我试过了:

    if all(available_resources.get(key, None) == val for key, val
                             in resources.items()):
          return True

它返回false,还有其他方法可以让它工作吗?

这可能是一个简单的符号错误吗? 从 "==" val 到 "<=" val? 我从下面得到了真实。

if all(available_resources.get(key, None) <= val for key, val
                             in resources.items()):
    return True

如果所有值都是整数,一种方法是使用collections.Counter

from collections import Counter

resources = {'B': 1, 's': 2, 't': 3, 'e': 3, '!': 1, 'h': 1, 'i': 1, ' ': 3, 'o': 1, 'g': 1, 'E': 1, 'A': 1, 'x': 2, 'p': 1, 'l': 1, 'r': 1}
available_resources = {'A': 1, 'l': 1, 'g': 1, 'o': 1, 'E': 1, 'x': 1, 'p': 1, 'e': 3, 'r': 1, 't': 3, ' ': 3, 'i': 1, 's': 2, 'h': 1, 'B': 1, '!': 1}


res = bool(Counter(resources) - Counter(available_resources))
print(res)

输出

True

您可以使用集合中的<=运算符。 此运算符确定一个集合是否是另一个集合的子集。

如下:

>>> resources.items() <= available_resources.items()
False

这将返回False因为不同字典中的元素x之间存在差异。 您可以使用集合运算符^看到这种差异,它将返回dict之间的对称差异:

>>> resources.items() ^ available_resources.items()
{('x', 1), ('x', 2)}

您需要使用<=而不是==

>>> all(available_resources.get(k, -1)<=v for k,v in resources.items())
True

此外,如果resources包含一些在available_resources中不存在的键,则上述方法可能会失败,并且您可以额外检查资源中的键是否是这种情况下 available_resources 中的键的子集

>>> all(available_resources.get(k, -1)<=v for k,v in resources.items()) and\
        set(resources).issubset(available_resources)
True

我已经测试了这个 stackoverflow 问题中的答案: 点击这里

我认为它对你有用!

all(item in available_resources.items() for item in resources.items())

# - or - # 

available_resources.items() <= resources.items()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM