2017-10-18 32 views
1

绘制元件假设一个多个深度字典从多个深度字典

{'definition': 'dirname', 
'get': ['getatime', 'getctime', 'getmtime', 'getsize'], 
'operation': ['join', 
       {'split':['split', 'splitdrive', 'splitext']}, 
       {'expand': ['expanduser', 'expandvars']}, 
       ], 
} 

我试图与一个definded函数来提取其项目。

lst = [] 
def count_d(dt): 
    global lst # global is unnecessary here 
    if isinstance(dt, dict): 
     for value in dt.values(): 
      if isinstance(value, str): 
       lst.append(value) 
      else: 
       count_d(value) 
    elif isinstance(dt,list): 
     for ele in dt: 
      if isinstance(ele, str): 
       lst.append(ele) 
      else: 
       count_d(ele) 
    return lst 

over_complicated递归函数解决了这个问题。

Out[121]: 
['dirname', 
'getatime', 
'getctime', 
'getmtime', 
'getsize', 
'join', 
'split', 
'splitdrive', 
'splitext', 
'expanduser', 
'expandvars'] 

我所期待的是:

lst = [] 
def count_d(dt): 
    global lst 
    for ele in dt: 
     if isinstance(ele,str): 
      lst.append(ele) 

或在一行更抽象的不声明变量,使用全局。

+0

你能写出你想要的输出吗? 它只是一个字符串数组,丢失所有关键信息: ['dirname','getatime','getctime','getmtime','getsize','join','split','splitdrive',' splitext','expanduser','expandvars'] –

+0

是@LukasAnsteeg –

+0

重要的是输出列表的顺序是否正确? –

回答

1

方法使用regex

import re 

j=[] 
y1 = re.compile("(?<=')[^']+(?='[,|\]$])") 
for value in y1.findall(str(dt)): 
    j.append(value) 
print(j) 

Outpu t

['dirname', 'getatime', 'getctime', 'getmtime', 'getsize', 'join', 'split', 'splitdrive', 'splitext', 'expanduser', 'expandvars'] 
2

递归代码来获得所有元素dictionary

def traverse(d): 
    for k, v in d.items(): 
     if isinstance(v, dict): 
      traverse(v) 
     else: 
      print(k,':',v) 

#traverse(d) 

#driver值

IN : 
d = {'definition': 'dirname', 
    'get': ['getatime', 'getctime', 'getmtime', 'getsize'], 
    'operation': ['join', 
        {'split': ['split', 'splitdrive', 'splitext']}, 
        {'expand': ['expanduser', 'expandvars']} 
        ] 
} 

OUT : 
definition : dirname 
get : ['getatime', 'getctime', 'getmtime', 'getsize'] 
operation : ['join', 
       {'split': ['split', 'splitdrive', 'splitext']}, 
       {'expand': ['expanduser', 'expandvars']} 
      ] 

编辑:按说明书中,从字典获得所有值 ,一般的递归方法:

l=[] 

def traverse(d): 
    for k, v in d.items(): 
     print(k,':',v) 

     if type(v)==list:     #since may be a list 
      for ele in v:     #access the list 
       if type(ele) == dict:  #since list may contain another dict 
        traverse(ele) 
       else:      #normal values inside the list 
        l.append(ele) 
        continue 

     elif isinstance(v, dict):   #if the value is a dict 
      traverse(v) 
     else:        #normal value 
      l.append(v) 

traverse(d) 
print(l) 

#driver值:

OUT: l = ['dirname', 
      'getatime', 
      'getctime', 
      'getmtime', 
      'getsize', 
      'join', 
      'split', 
      'splitdrive', 
      'splitext', 
      'expanduser', 
      'expandvars'] 
+0

未能将它们封闭在一个列表。 –

+0

值只是追加到另一个'list' –

+0

更复杂〜 –

0

我认为您的解决方案是好的,因为你想从两个字典和数组提取特定的数据。

稍短的版本可能是这一点,但我想这还不如“优雅”的希望:

def count_d(dt): 
    lst = [] 
    dt_values = dt.values() if isinstance(dt, dict) else dt 
    for value in dt_values: 
     if isinstance(value, str): 
      lst.append(value) 
     else: 
      lst.extend(count_d2(value)) 
    return lst 

此功能的优点是,它不需要你创建一个全局数组,这样你就可以拨打:

data = {'definition': 'dirname', 
     'get': ['getatime', 'getctime', 'getmtime', 'getsize'], 
     'operation': ['join', 
         {'split':['split', 'splitdrive', 'splitext']}, 
         {'expand': ['expanduser', 'expandvars']}, 
     ], 
    } 

print(count_d(data)) 

# ['dirname', 'join', 'split', 'splitdrive', 'splitext', 'expanduser', 'expandvars', 'getatime', 'getctime', 'getmtime', 'getsize']