用嵌套值切换嵌套字典键的Pythonic方法

用嵌套值切换嵌套字典键的Pythonic方法,python,dictionary,nested,Python,Dictionary,Nested,简而言之,我正在使用一个嵌套字典,其结构如下: nested_dict = {'key1':{'nestedkey1': 'nestedvalue1'}} nested_dict = {'nestedvalue1':{'nestedkey1': 'key1'}} nested_dict = {'nestedvalue1':{'NEWnestedkey1': 'key1'}} 我正试图找到一种用嵌套值切换键的pythonic方法,所以它看起来像这样: nested_dict = {'key1

简而言之,我正在使用一个嵌套字典,其结构如下:

nested_dict = {'key1':{'nestedkey1': 'nestedvalue1'}}
nested_dict = {'nestedvalue1':{'nestedkey1': 'key1'}}
nested_dict = {'nestedvalue1':{'NEWnestedkey1': 'key1'}}
我正试图找到一种用嵌套值切换键的pythonic方法,所以它看起来像这样:

nested_dict = {'key1':{'nestedkey1': 'nestedvalue1'}}
nested_dict = {'nestedvalue1':{'nestedkey1': 'key1'}}
nested_dict = {'nestedvalue1':{'NEWnestedkey1': 'key1'}}
我还尝试重命名嵌套的键值,因此最终字典将如下所示:

nested_dict = {'key1':{'nestedkey1': 'nestedvalue1'}}
nested_dict = {'nestedvalue1':{'nestedkey1': 'key1'}}
nested_dict = {'nestedvalue1':{'NEWnestedkey1': 'key1'}}
这更接近于我的工作:

original_dict = {
    'buford': {'id': 1},
    'henley': {'id': 2},
    'emi': {'id': 3},
    'bronc': {'id': 4}
}
我希望它看起来像这样:

new_dict = {
    1: {'pet': 'buford'},
    2: {'pet': 'henley'},
    3: {'pet': 'emi'},
    4: {'pet': 'bronc'}
}

有没有一种方法可以在一行中使用字典理解来做到这一点?我试图在这里了解基本知识,避免使用itertools之类的工具。

您可以使用字典理解来实现这一点,在构建时“交换”东西:

new_dict = {v['id']: {'pet': k} for k, v in original_dict.items()}
要将其扩展为for循环,它将如下所示:

new_dict = {}
for k, v in original_dict.items():
  new_dict[v['id']] = {'pet': k}

请注意,这两种情况显然都依赖于
'id'
值是唯一的,否则每次出现时都会覆盖该键。

要获得更通用的解决方案,您可以尝试以下方法:

def replace(d, change_to = 'pet'):
  return {b.values()[0]:{change_to:a} for a, b in d.items()}
输出:

{1: {'pet': 'buford'}, 2: {'pet': 'henley'}, 3: {'pet': 'emi'}, 4: {'pet': 'bronc'}}

这有很多限制。注意,一行程序并不是特别好。一组奇怪的大小调整,你不想使用类似“itertools”的东西,但字典理解就可以了?Itertools应该永远是你的第一个想法。一般来说,将所有内容放在一行并不是您应该努力做到的事情。我对python不太熟悉,所以我只是想了解字典理解如何与嵌套dict一起工作。因此,看到下面这样的结构布局对我非常有帮助,但我发现使用itertools可能会更有效。这太棒了,正是我想要的。谢谢你的帮助!我认为这是正确的答案,但这一切都取决于你拥有的数据。我还认为,当你进入这样一个嵌套的dict时,为了清晰起见,把它拉到for循环中可能更像python。你能告诉我for循环会是什么样子吗?太棒了,再次感谢!这使我的学习/吸收更加顺畅记住,由于字典是无序的,在
values()
上使用索引并不保证每次都能得到相同的条目(如果您有多个)。