0

重複の可能性:
Python 2.7x でネストされた辞書を平坦化する方法

私が辞書を持っている場合:

dictionaryname= { 'key1' : 'value1',
                     'key2' : 'value2',
                     'key3' : { 'key3a': 'value3a' },
                     'key4' : { 'key4a': { 'key4aa': 'value4aa',
                                           'key4ab': 'value4ab',
                                           'key4ac': 'value4ac'},
                                'key4b': 'value4b'}
                   }

結果が次のようになるようにするにはどうすればよいですか。

key1
value1
key2
value2
key3
key3a
value3a
...

辞書全体を印刷する必要がありますが、必ずしも正しい順序で印刷する必要はありません。

私が使用する場合:

def print_all(dictionaryname):
    for i in dictionaryname:
        print i

私は得るだけです:

key1
key2
key3
...

私は何をすべきか?

4

4 に答える 4

4

私が思いついた:

def printdict(d):
    for key, value in sorted(d.items()):
        print key
        if isinstance(value, dict):
            printdict(value)
        else:
            print value
于 2012-11-22T18:59:07.057 に答える
1

関数を使用して構造を平坦化する必要があります。

def flatten(d):
    for k, v in d.iteritems():
        yield k
        if isinstance(v, dict):
            for subitem in flatten(v):
                yield subitem
        else:
            yield v

次に、それを使用して構造をループします。

for item in flatten(dictionaryname):
    print item

Python 辞書は順序付けされていないため、出力はソートされず、構造を宣言した順序と一致しません。

なしのバージョンyield:

def flatten(d, res=None):
    if res is None:
        res = []
    for k, v in d.iteritems():
        res.append(k)
        if isinstance(v, dict):
            flatten(v, res)
        else:
            res.append(v)
    return res

両方のバージョンが出力されます:

>>> for item in flatten(dictionaryname):
...     print item
... 
key3
key3a
value3a
key2
value2
key1
value1
key4
key4a
key4ab
value4ab
key4ac
value4ac
key4aa
value4aa
key4b
value4b
于 2012-11-22T18:56:57.797 に答える
1
def print_all(d):
    if isintance(d, dict):
        for k,v in sorted(d.items()):
            print k
            print_all(v)
    else:
        print d
于 2012-11-22T18:58:50.967 に答える
0

面白いがあまり「適切」ではない方法の 1 つは、辞書を json 文字列に変換し、分割で遊ぶことです。

于 2012-11-22T19:11:53.297 に答える