2017-06-12 4 views
0

1つの辞書の値が他の辞書のリストの値よりもサブセットであるかどうかを確認する最も難しい方法は何ですか?これまでのところ、私は次のコードを持っています しかし、resからのitemBの値がvalBであれば、コードは大丈夫です。値がvalBAまたはvalBBの場合は失敗しました。1つの辞書からのチェック値は他の辞書からのものです

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] 
+4

有効なPython構文を使っています....あなたはどこで 'dict'構文を思いついたのですか? – CoryKramer

+1

https://docs.python.org/3/library/stdtypes.html#dict辞書辞書を作成するのにdictを使用する – jacobcan118

答えて

0

あなたはこれを試すことができます。

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

あなたが望むものをクリアしていないが - サブセット、またはサブセットの値である一覧表示するには?また、あなたはzipを必要としません - dictは順序を明確にすることができない限り(並べ替えを試みています)、2つの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 
+0

主語の目的は、res辞書のすべての値が辞書の意味であるかどうかを確認することです。 – jacobcan118

+0

サブセットをチェックする方法も追加しました。しかし、あなたのデータを見ると、サブセットのサブセットもチェックしたいですか?もしそうなら、それはどれくらい深いことでしょうか? – zwer

+0

はい、わずか2レベルですが、サブセットとサブセットのサブセットを同時に確認できるようにもっとpythonicを書いています。 – jacobcan118

関連する問題