6

私の質問は理解するのが少し複雑かもしれませんが、これが実際のことです。次のようなネストされた辞書があります。

dict_a = {'one': {'bird':2, 'tree':6, 'sky':1, 'TOTAL':9},
          'two': {'apple':3, 'sky':1, 'TOTAL':4},
          'three': {'tree':6, 'TOTAL':6},
          'four': {'nada':1, 'TOTAL':1},
          'five': {'orange':2, 'bird':3, 'TOTAL':5}
          }

そしてリスト:

list1 = ['bird','tree']
newlist = []

list1 の項目が dict_a のネストされた辞書にあるかどうかを確認し、それを newlist に追加するにはどうすればよいですか? 出力は次のようになります。

newlist = ['one','three','five']

鳥と木はたまたま、1、3、5 のネストされた辞書にあったためです。

私が考えることができるのは:

for s,v in dict_a.items():
    for s1,v1 in v.items():
        for item in list1:
            if item == s1:
               newlist.append(s)
4

1 に答える 1

3

list1セットを作成し、ディクショナリ ビューとリスト内包表記を使用します

set1 = set(list1)
newlist = [key for key, value in dict_a.iteritems() if value.viewkeys() & set1]

Python 3 では、代わりにvalue.keys()andを使用しdict_a.itemsます。

これは、辞書のキーと探しているキーのセットの間にセットの交差があるかどうかをテストします (効率的な操作)。

デモ:

>>> dict_a = {'one': {'bird':2, 'tree':6, 'sky':1, 'TOTAL':9},
...           'two': {'apple':3, 'sky':1, 'TOTAL':4},
...           'three': {'tree':6, 'TOTAL':6},
...           'four': {'nada':1, 'TOTAL':1},
...           'five': {'orange':2, 'bird':3, 'TOTAL':5}
...           }
>>> set1 = {'bird','tree'}
>>> [key for key, value in dict_a.iteritems() if value.viewkeys() & set1]
['three', 'five', 'one']

辞書の順序は任意であることに注意してください (使用されるキーと辞書の挿入および削除の履歴に応じて)。そのため、出力リストの順序は異なる場合があります。

技術的に言えば、リストを直接使用することもできます (value.viewkeys() & list1機能します) が、リストをセットにすると、意図がより明確になります。

于 2013-05-13T08:53:48.343 に答える