2015-02-05 63 views
0

我有一個python字典和一些字典中的一些值。我試圖用結尾處的值在結構中生成鍵的點分隔字符串。在下面的例子中,我想要FIELD0 1和NAME。我可以創建一個for循環來處理數據或遞歸函數。我不知道是否有某種預編譯方法可以摺疊多級字典來分隔字符串?Python多級字典到字符串

我正在嘗試以下,但你知道它只會附加子字典。

'.'.join('%s %s\n' % i for i in a.items()) 

{'BOGUS1': 'BOGUS_VAL1', 
'BOGUS2': 'BOGUS_VAL1', 
'FIELD0': {'F0_VAL1': 1, 'F0_VAL2': 2}, 
'FIELD1': {'F1_VAL1': 80, 'F1_VAL2': 67, 'F1_VAL3': 100}, 
'FOOBAR1': 'FB_VAL1', 
'NAME': 'VALUE'} 

BOGUS2.BOGUS_VAL1 
.NAME.VALUE 
.BOGUS1.BOGUS_VAL1 
.FIELD0.{'F0_VAL1': 1, 'F0_VAL2': 2} 
.FIELD1.{'F1_VAL2': 67, 'F1_VAL3': 100, 'F1_VAL1': 80} 
.FOOBAR1.FB_VAL1 

# Wanted results 
FIELD0.F0_VAL1 1 
FIELD0.F0_VAL2 2 
FIELD1.F1_VAL1 80 
FIELD1.F2_VAL1 67 
FIELD1.F3_VAL1 100 
NAME VALUE 
+0

爲什麼BOGUS1,BOGUS2和FOOBAR1應該在所需的輸出中跳過? – kylewm 2015-02-05 16:29:19

+0

這些字段存在於JSON中,我不需要在這個字符串上下文中使用它們,因爲它們是靜態值,其他字符將會不同,名稱將用於標識值集。 – LF4 2015-02-05 16:59:03

回答

1

怎麼是這樣的:

def dotnotation(d, prefix = ''): 
    for k, v in d.items(): 
     if type(v) == type(dict()): 
      dotnotation(v, prefix + str(k) + '.') 
     else: 
      print prefix + str(k) + ' = ' + str(v) 

同樣的格式,可以根據存儲的類型改變。這應該與你的例子。

+0

類型檢查的好處。 – LF4 2015-02-05 17:02:25

1

這裏是我的方法:

def dotted_keys(dic): 
    """ Generated dot notation keys from a dictionary """ 
    queue = [(None, dic)] # A queue of (prefix, object) 
    while queue: 
     prefix, current = queue.pop(0) 
     for k, v in current.iteritems(): 
      if isinstance(v, dict): 
       queue.append((k, v)) 
      elif prefix: 
       yield prefix + '.' + k 
      else: 
       yield k 


def dict_search(dic, dotted_key, default=None): 
    """ Take a dictionary and a dotted key and return the value. If not 
    found, return the value specified by the default parameter. 

    Example: dict_search(d, 'FIELD0.F0_VAL2') 
    """ 
    current = dic 
    keys = dotted_key.split('.') 

    for k in keys: 
     if k in current: 
      current = current[k] 
     else: 
      return default 
    return current 


if __name__ == '__main__': 
    d = { 
     'BOGUS1': 'BOGUS_VAL1', 
     'BOGUS2': 'BOGUS_VAL1', 
     'FIELD0': {'F0_VAL1': 1, 'F0_VAL2': 2, 'XYZ': {'X1': 9}}, 
     'FIELD1': {'F1_VAL1': 80, 'F1_VAL2': 67, 'F1_VAL3': 100}, 
     'FOOBAR1': 'FB_VAL1', 
     'NAME': 'VALUE' 
    } 

    for k in dotted_keys(d): 
     print(k, '=', dict_search(d, k)) 

輸出:

BOGUS2 = BOGUS_VAL1 
NAME = VALUE 
BOGUS1 = BOGUS_VAL1 
FOOBAR1 = FB_VAL1 
FIELD0.F0_VAL1 = 1 
FIELD0.F0_VAL2 = 2 
FIELD1.F1_VAL2 = 67 
FIELD1.F1_VAL3 = 100 
FIELD1.F1_VAL1 = 80 
XYZ.X1 = None 

dotted_keys函數生成點符號鍵的列表,而dict_search功能需要一個虛線鍵和返回值。

+0

謝謝我認爲for循環是唯一真正的方法,但python在過去讓我感到驚訝。 – LF4 2015-02-05 17:02:01