2016-07-21 9 views
0

私はdictsのリストを持っているとしましょう。その結果、Pythonでネストされた辞書の交差要素を取得する

{'david': {'status': 'available', 'location': [2, 3, 4]}, 'kuka': {'type': 'robot'}} 

、: たとえば、リストには、次のdictsが含まれています。その結果、

{'david': {'status': 'available', 'type': 'human, 'location': [2, 3, 4]}, 'kuka': {'type': 'robot'}} 

{'david': {'status': 'available', 'location': [2, 3, 4]}, 'kuka': {'status': 'available', 'type': 'robot'}} 

(ネストレベルが固定されていない)

、私が持っていると思います私は、キーだけでなく、両方のdictsに存在する共通の要素を含むdictを持っていたい。


ありがとうございました。

+0

何を試しましたか? –

+0

正直言って、これまでのところ何かを理解しようとしていません... – eljobso

+0

両方のdictsに同じキーが存在しますが、値は異なりますか?もしそうなら、あなたはこの場合何をしたいですか? –

答えて

1

すべての辞書キーを繰り返して反復することができます。これを書いている最もコンパクトな方法は、おそらく

def common_items(d1, d2): 
    return {k: common_items(d1[k], d2[k]) if isinstance(d1[k], dict) else d1[k] 
      for k in d1.viewkeys() & d2.viewkeys()} 

私は、コードを読みやすく、かつ異なる値がある場合にエラーを発生させることができるようにループのために外に辞書理解を綴るためにお勧めしたいです。

def common_items(d1, d2): 
    result = {} 
    for k in d1.viewkeys() & d2.viewkeys(): 
     v1 = d1[k] 
     v2 = d2[k] 
     if isinstance(v1, dict) and isinstance(v2, dict): 
      result[k] = common_items(v1, v2) 
     elif v1 == v2: 
      result[k] = v1 
     else: 
      raise VallueError("values for common keys don't match") 
    return result 
0

「交差点」の意味がわかりません。 各辞書項目の共通属性を取得する場合は、setを使用して、次のコードのすべての共通キーを取得できます。

common_keys = reduce(set.intersection, [set(i.keys()) for i in d.values()]) 

次に、共通のキーと値をフィルタリングするために辞書を反復することができます。

+0

たぶん交差点が間違った言葉でした。結果はセットであってはなりません。キーに共通のキー、値のペアがあるという情報を私に与えます。共通の要素をdictとして返すようにしたいのです。 – eljobso

+0

Eljobsoは、Neo Xのアドバイスを適用した後、リストに作成したセットの各キーの各辞書に値を追加する関数を書くのは簡単です。結果のリストを、同じキーを持つ辞書に追加します。結果の辞書を最後に返します。 – tanikaze

関連する問題