Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中查找两个dict之间的不匹配(键和值)_Python_Python 3.x - Fatal编程技术网

在python中查找两个dict之间的不匹配(键和值)

在python中查找两个dict之间的不匹配(键和值),python,python-3.x,Python,Python 3.x,查找两个DICT之间不匹配的键和值 superset = {"a":1, "b": 2, "c": 3, "d":4} subset = {"a":1, "b": 2, "c": 3, "d":4} print(all(item in superset.items() for item in subset.items())) # Expected output: True and desired output True superset = {"a":1, "b": 2, "c": 3, "

查找两个DICT之间不匹配的键和值

superset = {"a":1, "b": 2, "c": 3, "d":4}
subset = {"a":1, "b": 2, "c": 3, "d":4}
print(all(item in superset.items() for item in subset.items()))
# Expected output: True and desired output True


superset = {"a":1, "b": 2, "c": 3, "d":4, "e": 5}
subset = {"a":1, "b": 2, "c": 3, "d":5}
print(all(item in superset.items() for item in subset.items()))
# Expected output: False and desired output False

在下面的测试用例中,由于我只检查两个dict之间不匹配的键和值,所以在超集或子集dict中会忽略额外的键和值。在下面的例子中,子集中包含e是键,5是对应的值,相同的键或值在超集中不存在,因此我们可以忽略,因为它不是不匹配的

superset = {"a":1, "b": 2, "c": 3, "d":4}
subset = {"a":1, "b": 2, "c": 3, "d":4, "e": 5}
print(all(item in superset.items() for item in subset.items()))
# Expected output: True and desired output False
试试这个:

superset = {"a":1, "b": 2, "c": 3, "d":4}
subset = {"a":1, "b": 2, "c": 3, "d":4}
print([*superset.items()] == [*subset.items()])

superset = {"a":1, "b": 2, "c": 3, "d":4, "e": 5}
subset = {"a":1, "b": 2, "c": 3, "d":5}
print([*superset.items()] == [*subset.items()])

superset = {"a":1, "b": 2, "c": 3, "d":4}
subset = {"a":1, "b": 2, "c": 3, "d":4, "e": 5}
print([*superset.items()] == [*subset.items()])
输出:

下面是第二个示例,其中每个字典的长度相同,键相同,但其中一个键的关联值不同,因此您知道它适用于键和值:

superset = {"a":1, "b": 2, "c": 3, "d":4, "e": 5}
subset = {"a":1, "b": 2, "c": 3, "d":5, "e":5}
print([*superset.items()],[*subset.items())
print([*superset.items()] == [*subset.items()])
输出:

如果要忽略不匹配的键,只需检查两个DICT中存在的键:

superset = {"a":1, "b": 2, "c": 3, "d":4, "f":8}
subset = {"a":1, "b": 2, "c": 3, "d":4, "e": 5}
print(
    all(
        superset[key] == subset[key] 
        for key in set(superset.keys()) & set(subset.keys())
    )
)
将打印:

真的

如果要检查每个dict是否包含来自另一个dict的不匹配值,应如下修改代码:

superset = {"a":1, "b": 2, "c": 3, "d":4, "f": 10, "g": 5}
subset = {"a":1, "b": 2, "c": 3, "d":4, "e": 5}
print(
    all(
        superset[key] == subset[key] 
        for key in set(superset.keys()) & set(subset.keys())
    ) and
    all(
        superset[key] not in subset.values()
        for key in set(superset.keys()) - set(subset.keys())
    ) and
    all(
        subset[key] not in superset.values()
        for key in set(subset.keys()) - set(superset.keys())
    )
)
将打印:


False

您可以只循环一次,而不是像接受的答案那样循环几次。只需忽略不在超集内的键,因为我们正在使用子集进行迭代,它将自动忽略超集中不在子集内的所有键

print(all(subset[key] == superset[key] for key in subset if key in superset))
输出:


预期输出和期望输出之间有什么区别?在下面的测试用例中,由于我只检查两个DICT之间不匹配的键和值,所以在超集或子集DICT中会忽略额外的键和值。在下面的例子中,子集中包含e是键,5是对应的值,相同的键或值在超集中不存在,因此我们可以忽略,因为它不是不匹配的。超集={a:1,b:2,c:3,d:4}子集={a:1,b:2,c:3,d:4,e:5}在超集中打印项目。子集中的项目。项目预期输出:True和期望输出FALSESSUBSET={a:1,b:2,c:3,c:4}子集={a:1,b:2,c:3,d:4,e:5}打印[*超集]=[*子集]输出:False和预期输出为TrueUse[*superset.items]==[*subset.items]insteadsuperset={a:1,b:2,c:3,d:4,f:10,g:5}subset={a:1,b:2,c:3,d:4,e:100}打印[*superset.items]==[*subset.items]输出:False预期输出:True,因为两个指令之间没有不匹配的键值在上面的示例中,您的子集包含一个不在超集中的值e,那么它不应该是False吗?但是我看到了问题,超集中的额外值不应该被计算在子集中,对吗?我重新阅读了这个问题,以及我遇到的问题问题是如何定义额外的键?是的,Richard,基本上,我尝试的是比较两个dict并检查键和值是否包含相同的数据,如果其中任何一个dict包含额外的键和值,只需忽略,超集={a:1,b:2,c:3,c:3,d:4,f:10,g:5}子集={a:1,b:2,c:3,d:4,e:5}输出真:预期输出假,原因,原因超集g键5和子集e键包含5,因此不匹配更新答案。
True
False
True