簡體   English   中英

以有效的方式展開 python 字典

[英]unflatten a python dictionary in an efficient way

假設你有一個這樣的字典列表:

{'id':1,
'station': 'LYO',
'country': 'France',
'classes': 'EU',
'label': 'LYO CS',
'color': 'orange',
'population':100000,
'university':yes}

我想創建:

{'data':{'id':1,
        'station': 'LYO',
        'country': 'France'},
'classes': 'EU',
'label': 'LYO CS',
'color': 'orange',
'population':100000,
'university':yes}

基本上在數據子字典中包含 data_items= ['id','station','country'] 的鍵值

明顯的很長的路要走是:

data_keys = ['id','station']
data_sub_dict = {'data':{el:node[el] for el in data_keys}}
rest_sub_dict = {el:node[el] for el in node.keys() if el not in data_keys}
dict_result ={}
dict_result.update(data_sub_dict)
dict_result.update(rest_sub_dict)

這沒關系,但對我來說它聞起來不是很蟒蛇。

否則你會這樣做嗎? (更緊湊?,其他方法嗎?)

謝謝

為什么要update s?

可以使用dict構造函數在一條指令中編寫所有內容:

data = {'id':1,
'station': 'LYO',
'country': 'France',
'classes': 'EU',
'label': 'LYO CS',
'color': 'orange',
'population':100000,
'university':'yes'}


dict(
    {'data': {k:v for k,v in data.items() if k in ('id', 'station','country')}},
    **{k:v for k,v in data.items() if k in ('classes', 'color', 'population', 'university')})

結果:

{'data': {'id': 1, 'station': 'LYO', 'country': 'France'},
 'classes': 'EU',
 'color': 'orange',
 'population': 100000,
 'university': 'yes'}

我建議編寫一個 function 將字典分成兩部分,同時提供一個鍵列表:

def filterByKeys(d,keys):
    a={}; b={};
    for k in d:
        if k in keys: a[k] = d[k]
        else :        b[k] = d[k]
    return (a,b)
    
d1, d2 = filterByKeys(d,['id','station'])
{'data':d1,**d2}

雖然這種方法不使用列表推導來迭代字典,但它變得非常容易理解。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM