0

次のような辞書の辞書があります。

lst1 = {1: {"a": "x","b": "y"}, 2: {"b": "y", "c": "z"}}

私はそれからフラットな辞書を作りたいです。ネストされた dict の 1 つに固有のキーのみがフラット化された dict に存在するように、重複するキーはすべて削除する必要があります。上記の辞書は次のようになります。

{"a": "x", "c": "z"}

簡単なコードは次のようになります。

for key, value in lst1.iteritems():
   for key1, value1  in value.iteritems():
      if key1 <> "b":
         lst2[key1]=value1 

ここここここで以前の回答をいくつか試しましたが、正しく機能しませんでした。

以下のコードはエラーを返します: 値が定義されていません

lst2 = {key1: value1 for key1, value1 in value for key, value in lst1.items()}

これです:

 lst2 = dict((key1, value1) for key1, value1 in (value for key, value in lst1.items()))

戻り値:

 {'a': 'b', 'c': 'b'}

説明したように、構造を正しく平坦化するにはどうすればよいですか?

4

1 に答える 1

1

複製時にそれらを削除するために、どのキーがフラット化された構造に既に追加されているかを追跡する必要があるため、単一の理解では不可能な場合があります。for ループでフラット化された構造を構築するソリューションは、依然として簡単です。sub-dicts から出力にアイテムを追加するか、キーが再び見つかった場合は削除します。

data = {1: {'a': 'x', 'b': 'y'}, 2: {'b': 'y', 'c': 'z'}}
out = {}

for sub in data.values():
     for key, value in sub.items():
         if key in out:
             del out[key]
         else:
             out[key] = value

print(out)  # {'a': 'x', 'c': 'z'}

2 つの内包表記とCounterを使用して行うこともできます。最初に各サブキーが出現する回数を追跡し、次に 1 回出現するキーのみを平坦化します。

from collections import Counter

data = {1: {'a': 'x', 'b': 'y'}, 2: {'b': 'y', 'c': 'z'}}

c = Counter(key for sub in data.values() for key in sub)
out = {key: value for sub in data.values() for key, value in sub.items() if c[key] == 1}

print(out)  # {'a': 'x', 'c': 'z'}
于 2014-12-08T15:45:09.447 に答える