1

次の作業を行う関数を作成する必要があります

辞書の辞書で文字列を値として検索し、そのキーを返します (メイン辞書にある場合は 1 番目のキー、サブ辞書にある場合は 2 番目のキー)。

ソースコード

ここに私が実装しようとしている関数がありますが、この場合は次のエラーが発生するため、リストを辞書に変換する方法の答えが見つからないため、正しく機能しません

for v, k in l: ValueError: アンパックするには複数の値が必要です

def GetKeyFromDictByValue(self, dictionary, value_to_find):
    """"""

    key_list = [k for (k, v) in dictionary.items() if v == value_to_find]
    if key_list.__len__() is not 0:
        return key_list[0]
    else:
        l = [s for s in dictionary.values() if  ":" in str(s)]
        d = defaultdict(list)
        for v, k in l:
            d[k].append(v)

        print d

dict = {'a': {'a1': 'a2'}, "aa": "aa1", 'aaa': {'aaa1': 'aaa2'}}
print GetKeyFromDictByValue(dict, "a2")

Python 2.5でこれを行う必要があります

4

1 に答える 1

4

ディクショナリ値のみのリストを作成しましたが、それらのディクショナリのキーと値の両方が既に含まれているかのようにループしようとしました。おそらく、一致した各辞書をループしたかったのでしょうか?

l = [v for v in dictionary.values() if  ":" in str(v)]
d = defaultdict(list)
for subdict in l:
    for k, v in subdict.items():

代わりに、構造を平坦化します。

def flatten(dictionary):
    for key, value in dictionary.iteritems():
        if isinstance(value, dict):
            # recurse
            for res in flatten(value):
                yield res
        else:
            yield key, value

次に検索します:

def GetKeyFromDictByValue(self, dictionary, value_to_find):
    for key, value in flatten(dictionary):
        if value == value_to_find:
            return key

デモ:

>>> sample = {'a': {'a1': 'a2'}, "aa": "aa1", 'aaa': {'aaa1': 'aaa2'}}
>>> GetKeyFromDictByValue(None, sample, "a2")
'a1'
于 2013-08-08T07:26:37.403 に答える