2017-04-25 101 views
0

我试图创建一个嵌套的字典,格式如下:追加列表中嵌套的字典蟒蛇内在价值

d3 = {'343564': {'32.cnt':['eeo', 'eec', 'vp3'], 
       'avg.ps': ['cpt', 'vp3', 'ern']}} 

这是我到目前为止有哪些:

d2 = {} 
for r,d,f in os.walk(path): 
    for n in f: 
     if n.endswith(('txt', 'sub','avg', 'dat')): 
      pass 
     if n.endswith('32.cnt'): 
      split=n.split("_") 
      d2.setdefault(split[3], []).append({split[-1]:split[0]}) 

,但它返回:

{'343564': [{'32.cnt': 'eeo'}, 
    {'32.cnt': 'eec'}, 
    {'32.cnt': 'vp3'}, 
    {'avg.ps': 'cpt'}, 
    {'avg.ps': 'vp3'} 
    {'avg.ps': 'ern} 

如何将内键“折叠”为1键并从内部值创建列表?

+0

文件名的例子被拆分会有助于重现问题。 –

回答

1

我猜在文件名格式,与它是什么样子,你正在尝试的工作原理:

from collections import defaultdict 
from pprint import pprint 
d2 = defaultdict(lambda:defaultdict(list)) 
for n in ['eeo_xxx_xxx_343564_32.cnt','eec_xxx_xxx_343564_32.cnt','vp3_xxx_xxx_343564_32.cnt', 
      'cpt_xxx_xxx_343564_avg.ps','vp3_xxx_xxx_343564_avg.ps','ern_xxx_xxx_343564_avg.ps']: 
    split=n.split("_") 
    d2[split[3]][split[-1]].append(split[0]) 

pprint(d2) 

输出:

{'343564': {'32.cnt': ['eeo', 'eec', 'vp3'], 
      'avg.ps': ['cpt', 'vp3', 'ern']}} 
+0

你的答案是现货。 lambda的目的是什么? – e9e9s

+0

@ e9e9s'defaultdict'的参数必须是可调用的并返回一个实例。 'defaultdict(list)'是一个实例,所以我使用lambda来创建一个返回该实例的可调用对象。 –