Python中的多字典

Python中的多字典,python,dictionary,Python,Dictionary,我有一本多功能词典: {'a': {'b': {'c': {'d': '2'}}}, 'b': {'b': {'c': {'d': '7'}}}, 'c': {'b': {'c': {'d': '3'}}}, 'f': {'d': {'c': {'d': '1'}}}} 如何根据值“2”“3”“7”“1”对其进行排序 因此,我的输出将是: f.d.c.d.1 a.b.c.d.2 c.b.c.d.3 b.b.c.d.7 您可以递归地执行此操作: d = {'a': {'b': {'c':

我有一本多功能词典:

{'a': {'b': {'c': {'d': '2'}}},
 'b': {'b': {'c': {'d': '7'}}},
 'c': {'b': {'c': {'d': '3'}}},
 'f': {'d': {'c': {'d': '1'}}}}
如何根据值“2”“3”“7”“1”对其进行排序 因此,我的输出将是:

f.d.c.d.1
a.b.c.d.2
c.b.c.d.3
b.b.c.d.7

您可以递归地执行此操作:

d = {'a': {'b': {'c': {'d': '2'}}}, 'c': {'b': {'c': {'d': '3'}}}, 'b': {'b': {'c': {'d': '7'}}}, 'f': {'d': {'c': {'d': '1'}}}}

def nested_to_string(item):

    if hasattr(item, 'items'):
        out = ''
        for key in item.keys():
            out += '%s.' % key + nested_to_string(item[key])
        return out
    else:
        return item + '\n'

print nested_to_string(d)


为什么要这样做。

您有一个固定的形状结构,排序非常简单:

>>> d = {'a': {'b': {'c': {'d': '2'}}}, 'c': {'b': {'c': {'d': '3'}}}, 'b': {'b': {'c': {'d': '7'}}}, 'f': {'d': {'c': {'d': '1'}}}}
>>> sorted(d, key=lambda x: d[x].values()[0].values()[0].values()[0])
['f', 'a', 'c', 'b']
>>> sorted(d.items(), key=lambda x: x[1].values()[0].values()[0].values()[0])
[('f', {'d': {'c': {'d': '1'}}}),
 ('a', {'b': {'c': {'d': '2'}}}),
 ('c', {'b': {'c': {'d': '3'}}}),
 ('b', {'b': {'c': {'d': '7'}}})]
是的,这有点丑陋和笨拙,但这只是因为你的结构天生丑陋和笨拙

事实上,除了d['f']有一个键“d”而不是“b”之外,它更简单。我怀疑这可能是一个打字错误,在这种情况下,事情就更容易了:

>>> d = {'a': {'b': {'c': {'d': '2'}}}, 'c': {'b': {'c': {'d': '3'}}}, 'b': {'b': {'c': {'d': '7'}}}, 'f': {'b': {'c': {'d': '1'}}}}
>>> sorted(d.items(), key=lambda x:x[1]['b']['c']['d'])
[('f', {'b': {'c': {'d': '1'}}}),
 ('a', {'b': {'c': {'d': '2'}}}),
 ('c', {'b': {'c': {'d': '3'}}}),
 ('b', {'b': {'c': {'d': '7'}}})]
正如其他人所指出的,无论您试图做什么,这几乎肯定不是正确的数据结构。但是,如果是的话,这就是如何处理它


顺便说一句,把它称为多字典是很混乱的。该术语通常意味着每个键可能有多个值的字典,在Python中,您可能会将其实现为默认值为list或set的defaultdict。恰好包含字典的单值字典最好命名为嵌套字典。

在我看来,这种设计很难阅读和维护。你能考虑用字符串名称替换内部字典吗? 例如:

这本书更容易分类,也更容易阅读

现在,由于字典的性质,它是不可排序的。因此,您必须对其进行排序,例如列表表示:

my_sorted_dict_as_list = sorted(mydict.items(), 
                                key=lambda kv_pair: kv_pair[1])

您的数据结构基本上是一个多级树,因此,要实现您想要的功能,一个好方法是对其进行所谓的深度优先遍历(可以递归地进行遍历),然后稍微调整中间结果,将其排序并格式化为所需的格式

multidict = {'a': {'b': {'c': {'d': '2'}}},
             'b': {'b': {'c': {'d': '7'}}},
             'c': {'b': {'c': {'d': '3'}}},
             'f': {'d': {'c': {'d': '1'}}}}

def nested_dict_to_string(nested_dict):
    chains = []
    for key,value in nested_dict.items():
        chains.append([key] + visit(value))
    chains = ['.'.join(chain) for chain in sorted(chains, key=lambda chain: chain[-1])]
    return '\n'.join(chains)

def visit(node):
    result = []
    try:
        for key,value in node.items():
            result += [key] + visit(value)
    except AttributeError:
        result = [node]
    return result

print nested_dict_to_string(multidict)
输出:

f、 d.c.d.1 a、 b.c.d.2 c、 b.c.d.3 b、 公元前7年
你为什么不用f.d.c.d.和a.b.c.d.等作为钥匙呢?筑巢有什么意义?你试过什么?你是怎么得到这么复杂的结构的?你需要弄清楚你到底是什么…嗨,我试过了,但没用。。+:“dict”和“str”的操作数类型不受支持
my_sorted_dict_as_list = sorted(mydict.items(), 
                                key=lambda kv_pair: kv_pair[1])
multidict = {'a': {'b': {'c': {'d': '2'}}},
             'b': {'b': {'c': {'d': '7'}}},
             'c': {'b': {'c': {'d': '3'}}},
             'f': {'d': {'c': {'d': '1'}}}}

def nested_dict_to_string(nested_dict):
    chains = []
    for key,value in nested_dict.items():
        chains.append([key] + visit(value))
    chains = ['.'.join(chain) for chain in sorted(chains, key=lambda chain: chain[-1])]
    return '\n'.join(chains)

def visit(node):
    result = []
    try:
        for key,value in node.items():
            result += [key] + visit(value)
    except AttributeError:
        result = [node]
    return result

print nested_dict_to_string(multidict)