Я пытаюсь понять, как получить значения из понимания, которое почти работает. Из этих данных..
{'rock': {}, 'coal1': {'gold1': {'data': ['g1']}}, 'coal2': {'gold3': {'data': ['g3']}, 'gold2': {'data': ['g2']}}}
.. я пытаюсь извлечь данные золотого ключа в простой диктофон. т. е. набор из { gold : {'data' : [...]} }
элементов, по существу вырывающих угольные ключи из данных.
другими словами отсюда..
{
"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']}}}
И получение значений избавляет от угольных ключей.
>>> [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 только потому, что ее легче понять и она немного лучше работает. Кстати, рок должен быть отброшен, даже если он имеет ценность, поэтому я не мог обойти if k != 'rock'
. Итак, вот результаты и... Спасибо, ребята.
>>> 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
>>>