说我有一个类似的字典:
d = {'a': 1, 'b': {'sa': 11, 'sb': 22, 'sc': {'ssa': 111, 'ssb': 222}}, 'c': 3}
我想要一个列表,列出其值不是其他词组的所有键,但用点符号表示(假设你在dict的每个级别'点')。换句话说,我想要所有没有孩子的值的复合点符号键。
例如,对于上述词典,我想得到(不一定按任何顺序):
['a',
'b.sa',
'b.sb',
'b.sc.ssa',
'b.sc.ssb',
'c']
答案 0 :(得分:2)
我确信有一种更优雅的方法可以解决这个问题,但这应该可以让你开始。
d = {'a': 1, 'b': {'sa': 11, 'sb': 22, 'sc': {'ssa': 111, 'ssb': 222}}, 'c': 3}
def dotter(d, key, dots):
if isinstance(d, dict):
for k in d:
dotter(d[k], key + '.' + k if key else k, dots)
else:
dots.append(key)
return dots
print dotter(d, '', [])
答案 1 :(得分:0)
d = {'a': 1, 'b': {'sa': 11, 'sb': 22, 'sc': {'ssa': 111, 'ssb': 222}}, 'c': 3}
def fun(k, d, pre):
path = '%s.%s' % (pre, k) if pre else k
return path if type(d[k]) is not dict else ",".join([fun(i,d[k], path) for i in d[k]])
print ",".join([fun(k,d, '') for k in d]).split(',')
输出
[' a'' c',' b.sc.ssa',' b.sc.ssb',&# 39; b.sb',' b.sa']
答案 2 :(得分:0)
如果您想要dict及其值
def dotter(mixed, key='', dots={}):
if isinstance(mixed, dict):
for (k, v) in mixed.items():
dotter(mixed[k], '%s.%s' % (key, k) if key else k)
else:
dots[key] = mixed
return dots
>>> d = {'a': 1, 'b': {'sa': 11, 'sb': 22, 'sc': {'ssa': 111, 'ssb': 222}}, 'c': 3}
>>> dotted_dict = dotter(d)
>>> print(dotted_dict)
{'a': 1, 'c': 3, 'b.sa': 11, 'b.sb': 22, 'b.sc.ssb': 222, 'b.sc.ssa': 111}