Python 从理解中获得关键价值

Python 从理解中获得关键价值,python,dictionary,list-comprehension,dictionary-comprehension,Python,Dictionary,List Comprehension,Dictionary Comprehension,我试图找出如何从几乎有效的理解中获得价值。从这些数据中 {'rock': {}, 'coal1': {'gold1': {'data': ['g1']}}, 'coal2': {'gold3': {'data': ['g3']}, 'gold2': {'data': ['g2']}}} 。。我试图将金钥匙数据提取到简单的dict中。例如,{gold:{'data':[…]}}项的dict本质上就是从数据中剥离煤炭钥匙 换句话说,从这个 { "coal2": { "gold3": {

我试图找出如何从几乎有效的理解中获得价值。从这些数据中

{'rock': {}, 'coal1': {'gold1': {'data': ['g1']}}, 'coal2': {'gold3': {'data': ['g3']}, 'gold2': {'data': ['g2']}}}
。。我试图将金钥匙数据提取到简单的dict中。例如,
{gold:{'data':[…]}}
项的dict本质上就是从数据中剥离煤炭钥匙

换句话说,从这个

{
  "coal2": {
    "gold3": {
      "data": [
        "g3"
      ]
    },
    "gold2": {
      "data": [
        "g2"
      ]
    }
  },
  "coal1": {
    "gold1": {
      "data": [
        "g1"
      ]
    }
  },
  "rock": {}
}
改为这种格式

{
  "gold3": {
    "data": [
      "g3"
    ]
  },
  "gold1": {
    "data": [
      "g1"
    ]
  },
  "gold2": {
    "data": [
      "g2"
    ]
  }
}
这几乎奏效了。这可以去除岩石

>>> {k:d for k,d in data.items() if k != 'rock'}
{'coal2': {'gold3': {'data': ['g3']}, 'gold2': {'data': ['g2']}}, 'coal1': {'gold1': {'data': ['g1']}}}
而获取这些值就可以去掉coal键

>>> [v for v in {k:d for k,d in data.items() if k != 'rock'}.values()]
[{'gold3': {'data': ['g3']}, 'gold2': {'data': ['g2']}}, {'gold1': {'data': ['g1']}}]
但我想不出如何从中解脱出来

>>> for i in [v for v in {k:d for k,d in data.items() if k != 'rock'}.values()] : print(i)
...
{'gold3': {'data': ['g3']}, 'gold2': {'data': ['g2']}}
{'gold1': {'data': ['g1']}}
到所需的结构。如果这一切都能被理解,那就太好了。有人知道如何做到这一点吗

编辑: 两个答案都令人惊讶,我希望我能接受这两个答案。我不喜欢导入任何东西,但我接受@blhsing itertools版本,因为它更容易理解,而且性能更好。顺便说一句,岩石必须被丢弃,即使它有值,所以我不能绕过
如果k!='摇滚乐“
。这是结果和。。。谢谢各位

>>> import timeit
>>> data = {'rock': {'type':'pebble'}, 'coal1': {'gold1': {'data': ['g1']}}, 'coal2': {'gold3': {'data': ['g3']}, 'gold2': {'data': ['g2']}}}
>>> timeit.timeit( "dict(kv for x in (v for v in {k:d for k,d in data.items() if k != 'rock'}.values()) for kv in x.items())" ,  setup="from __main__ import data")            
2.6714617270044982
>>>
>>> timeit.timeit( "dict(chain.from_iterable(g.items() for g in {k:d for k,d in data.items() if k != 'rock'}.values()))" , setup="from __main__ import data; from itertools import chain")
2.22612579818815
>>>

只需将
目录的
列表
添加到
目录
(通过添加第二行修复代码)


一行

dict(v for d in d.values() for v in d.items()) # d is your dict
Out[436]: 
{'gold1': {'data': ['g1']},
 'gold2': {'data': ['g2']},
 'gold3': {'data': ['g3']}}

您可以使用输出主目录值的子目录项的生成器表达式,并使用
itertools.chain.from\u iterable
连接这些项,并将它们传递给
dict
构造函数:

from itertools import chain
dict(chain.from_iterable(g.items() for g in d.values()))
因此,鉴于:

d = {'rock': {}, 'coal1': {'gold1': {'data': ['g1']}}, 'coal2': {'gold3': {'data': ['g3']}, 'gold2': {'data': ['g2']}}}
这将返回:

{'gold3': {'data': ['g3']}, 'gold2': {'data': ['g2']}, 'gold1': {'data': ['g1']}}

哦,让我惊讶的是,对这个解决方案的另一种重新表述仍然比itertools版本慢<代码>>>>timeit.timeit(“dict(数据中的d代表v.values()代表数据中的v.items(),如果v[0]!='rock')”,setup=“from uuu main_uuu导入数据”)
2.7223397847265005
{'gold3': {'data': ['g3']}, 'gold2': {'data': ['g2']}, 'gold1': {'data': ['g1']}}