假设我有一个用 JSON 表示的表作为字典列表,其中每个项目的键是相同的:
J = [
{
"symbol": "ETHBTC",
"name": "Ethereum",
:
},
{
"symbol": "LTC",
"name": "LiteCoin"
:
},
并假设我需要有效的查找,例如symbols['ETHBTC']['name']
我可以用 转换symbols = { item['name']: item for item in J }
,产生:
{
"ETHBTC": {
"symbol": "ETHBTC",
"name": "Ethereum",
:
},
"LTCBTC": {
"symbol": "LTCBTC",
"name": "LiteCoin",
:
},
(理想情况下,我也会删除现在多余的symbol
字段)。
但是,如果每个项目本身都包含一个“table-as-list-of-dicts”怎么办?
这是一个更完整的最小示例(我删除了与问题无关的行):
J = {
"symbols": [
{
"symbol":"ETHBTC",
"filters":[
{
"filterType":"PRICE_FILTER",
"minPrice":"0.00000100",
},
{
"filterType":"PERCENT_PRICE",
"multiplierUp":"5",
},
],
},
{
"symbol":"LTCBTC",
"filters":[
{
"filterType":"PRICE_FILTER",
"minPrice":"0.00000100",
},
{
"filterType":"PERCENT_PRICE",
"multiplierUp":"5",
},
],
}
]
}
因此,挑战是将这种结构转变为:
J = {
"symbols": {
"ETHBTC": {
"filters": {
"PRICE_FILTER": {
"minPrice": "0.00000100",
:
}
我可以写一个flatten
函数:
def flatten(L:list, key) -> dict:
def remove_key_from(D):
del D[key]
return D
return { D[key]: remove_key_from(D) for D in L }
然后我可以展平外部列表并遍历结果字典中的每个键/值,展平val['filters']
:
J['symbols'] = flatten(J['symbols'], key="symbol")
for symbol, D in J['symbols'].items():
D['filters'] = flatten(D['filters'], key="filterType")
glom
是否可以使用(或其他方式)对此进行改进?
初始转换没有性能限制,但我需要有效的查找。