2015-07-12 260 views
1

我想實例化一個嵌套的字典,其中包含另一個字典作爲鍵和每個這些字典包含另一個字典。我知道嵌套和嵌套嵌套字典中有哪些鍵和多少個鍵,但我不知道上部字典中有多少個鍵和哪些鍵(這將是OrderedDict和鍵將是整數,但我不知道知道多少)。實例化一個嵌套的字典

上面的詞典包含整數作爲鍵和詞典作爲值 - 每個這些詞典有3 keys = 'forth','back''price'

'forth''back'另有字典作爲它們的值。每個類型的字典(值)包含了這些鍵

'arr_date','arr_place','dep_date','dep_place'. 

因此,例如,「規定」字典是:

dict.fromkeys(['arr_date','arr_place','dep_date','dep_place'],None) 

因此,問題是,我想要實例與這些密鑰,但這一問題的字典上部字典可以具有可變整數。它可以包含這些密鑰[1,2,3,4],但也可以包含[1,2,3,4,5,6,7,8]

這是一個嵌套和嵌套嵌套實例化的例子。所以這將是每個鍵的上字典的值(我不確定條件是否會起作用)。

dict.fromkeys(['forth','back','price'], dict.fromkeys(['arr_date','arr_place','dep_date','dep_place'],None) if key in ['forth','back'] else None) 

整件事情是我想告訴代碼儘可能多的默認值和鍵。

任何建議?

編輯:條件6行以上不起作用,所以任何人都可以告訴如何做到這一點。

編輯II:所以字典應該看起來像:

{1:{'forth':{'arr_date':'15-8-4','arr_place':'Atlanta','dep_date':'15-8-4','dep_place':'New York'},'back':{'arr_date...},'price':158},2:{....}} 
+0

,你能否告訴一下這本字典可能看起來像使用文字字典語法的例子嗎?我不太明白你想做什麼。 –

+0

我完全不理解你的問題,但你確定你想要一些字典作爲另一個字典的關鍵嗎?這是不可能的,因爲鍵需要可哈希對象,這些字典不是... –

+0

如果你真的有字典詞典的字典,那麼保持不同層次的直觀可能看起來很複雜。您可以引入功能來管理複雜性。編寫一個makeimpledict函數,它可以創建最內層的字典(使用任何你想要的默認值),然後編寫另一個函數makemetadict,它使用第一個函數創建值並返回中級字典,然後在該階段使頂層級別的字典可以是一個簡單的字典理解使用'makemetadict' –

回答

0

也許是這樣的:

def inner_dict(vals = []): 
    my_vals = vals + [None]*(4 - len(vals)) 
    my_keys = ['arr_date','arr_place','dep_date','dep_place'] 
    return dict(zip(my_keys,my_vals)) 

def middle_dict(fvals = [], bvals = [], price = None): 
    d = {"forth": inner_dict(fvals),"back":inner_dict(bvals), 'price': price} 
    return d 

典型用途:

>>> middle_dict(['5-18-4', 'Atlanta','5-18-4','New York'], 
     ['5-19-4', 'New York','5-19-4','Atlanta'], 134.05) 
{'forth': {'arr_date': '5-18-4', 'dep_place': 'New York', 'dep_date': '5-18-4', 'arr_place': 'Atlanta'}, 'price': 134.05, 'back': {'arr_date': '5-19-4', 'dep_place': 'Atlanta', 'dep_date': '5-19-4', 'arr_place': 'New York'}} 
>>> 
>>> d = {i:middle_dict() for i in range(1,4)} 
>>> d 
{1: {'forth': {'arr_date': None, 'dep_place': None, 'dep_date': None, 'arr_place': None}, 'price': 0.0, 'back': {'arr_date': None, 'dep_place': None, 'dep_date': None, 'arr_place': None}}, 2: {'forth': {'arr_date': None, 'dep_place': None, 'dep_date': None, 'arr_place': None}, 'price': 0.0, 'back': {'arr_date': None, 'dep_place': None, 'dep_date': None, 'arr_place': None}}, 3: {'forth': {'arr_date': None, 'dep_place': None, 'dep_date': None, 'arr_place': None}, 'price': 0.0, 'back': {'arr_date': None, 'dep_place': None, 'dep_date': None, 'arr_place': None}}} 
0

這將產生空有序字典你正在尋找假設你想在你的嵌套字典中使用None值實例化:

from collections import OrderedDict 
d=OrderedDict() 
for x in range(1,6): 
    d[x]={key:dict.fromkeys(['arr_date','arr_place','dep_date','dep_place'],None) if key in ['forth','back'] else None for key in ['forth','back','price']} 

這樣做具有以下字典:

In[42]: dict(d) 
Out[42]: {1: {'price': None, 'forth': {'arr_date': None, 'dep_date': None, 'arr_place': None, 'dep_place': None}, 'back': {'arr_date': None, 'dep_date': None, 'arr_place': None, 'dep_place': None}}, 2: {'price': None, 'forth': {'arr_date': None, 'dep_date': None, 'arr_place': None, 'dep_place': None}, 'back': {'arr_date': None, 'dep_date': None, 'arr_place': None, 'dep_place': None}}, 3: {'price': None, 'forth': {'arr_date': None, 'dep_date': None, 'arr_place': None, 'dep_place': None}, 'back': {'arr_date': None, 'dep_date': None, 'arr_place': None, 'dep_place': None}}, 4: {'price': None, 'forth': {'arr_date': None, 'dep_date': None, 'arr_place': None, 'dep_place': None}, 'back': {'arr_date': None, 'dep_date': None, 'arr_place': None, 'dep_place': None}}, 5: {'price': None, 'forth': {'arr_date': None, 'dep_date': None, 'arr_place': None, 'dep_place': None}, 'back': {'arr_date': None, 'dep_date': None, 'arr_place': None, 'dep_place': None}}}