Python 检查一个dict的值包含另一个dict的值

Python 检查一个dict的值包含另一个dict的值,python,python-2.7,python-3.x,Python,Python 2.7,Python 3.x,对于我来说,检查一个字典中的值是否是另一个字典中列表值的子集的最简单的方法是什么。到目前为止,我有以下代码 但是,如果res中itemB的值为valB,则代码是ok的。但它失败了,如果值是valBA或valBB exp = dict(itemA = ['valA1', 'valA2'], itemB = ['valB', ['valBA', 'valBB']], itemC = ['valC1', 'valC2']) res = dict(itemA = 'valA1', itemB = 'va

对于我来说,检查一个字典中的值是否是另一个字典中列表值的子集的最简单的方法是什么。到目前为止,我有以下代码 但是,如果res中itemB的值为valB,则代码是ok的。但它失败了,如果值是valBA或valBB

exp = dict(itemA = ['valA1', 'valA2'], itemB = ['valB', ['valBA', 'valBB']], itemC = ['valC1', 'valC2'])
res = dict(itemA = 'valA1', itemB = 'valBA', itemC = 'valC1')
for e, r in zip(sorted(exp), sorted(res)):
    if r == 'itemB':
        return any(res[r] in s for s in exp[e][0])
    else:
        return res[r] in exp[e]
您可以尝试以下方法:

exp = dict(itemA = ['valA1', 'valA2'], itemB = ['valB', ['valBA', 'valBB']], itemC = ['valC1', 'valC2'])
res = dict(itemA = 'valA1', itemB = 'valBA', itemC = 'valC1')

new_vals = [a for a, b in zip(res.values(), exp.values()) if a in b]

不清楚您想要什么-列出哪些是子集或子集值?此外,您不需要zip-因为
dict
是一个无序集,除非您可以提供一个清晰的顺序(您正在尝试使用排序),并且如果两个dict没有相同的编号和相同的命名键,那么它将失败。这样做要简单得多:

exp = dict(itemA=['valA1','valA2'],itemB=['valB',['valBA','valBB']],itemC=['valC1','valC2'])
res = dict(itemA='valA1',itemB='valBA',itemC='valC1')

subsets = [k for k, v in res.items() if v in exp.get(k, {})]
# ['itemC', 'itemA']

subset_values = [v for k, v in res.items() if v in exp.get(k, {})]
# ['valA1', 'valC1']

# to check if all subsets exist
all_subsets = all(v in exp.get(k, {}) for k, v in res.items())
# False
如果需要检查两个级别,假设子子子级别是一个列表,则可以按以下方式执行:

subsets = []
for group, value in res.items():
    for subgroup in exp.get(group, []):
        if value == subgroup or (isinstance(subgroup, list) and value in subgroup):
            subsets.append(group)  # or append value if you're after that
            break

 # ['itemA', 'itemB', 'itemC']

 # or to check if all matched:
 all_subsets = len(subsets) == len(exp)
 # True

如果您从有效的Python语法开始,这将有所帮助。。。。你是从哪里想出这个
dict
语法的?我只是使用dict创建字典变量。主要目的是检查res dictionary中的所有值是否都在dictionary exp的值中。我还添加了如何检查子集。但是看看你的数据,你想检查子集的子集吗?如果是这样的话,它有多深?是的,只有2层,但我想写一些更具pythonic的东西,可以同时检查子集和子集的子集time@jacobcan118检查更新。。。这有点冗长,但是,虽然你完全可以在一行中完成,但如果你追求虚幻的“Pythonic”方法,那么简单总是比复杂好,可读总是比不可读好。理解经常被认为一行程序默认是Pythonic的人滥用,即使这样做常常以牺牲可读性和/或性能为代价。