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

一种有趣但不是很“正确”的方法是将字典转换为 json 字符串并进行拆分。

于 2012-11-22T19:11:53.297 回答