假设我有一本字典,看起来像:
d = {'a': 1, 'b': {'sa': 11, 'sb': 22, 'sc': {'ssa': 111, 'ssb': 222}}, 'c': 3}我想要一个所有键的列表,这些键的值不是其他的dict,而是用它们的点表示法表示的(假设您在dict的每个级别上都有‘点’)。换句话说,我想要所有没有孩子的值的复合点符号键。
例如,对于上面的dict,我想得到(不一定按任何顺序):
['a',
'b.sa',
'b.sb',
'b.sc.ssa',
'b.sc.ssb',
'c']发布于 2015-04-17 02:36:13
我相信有一个更优雅的方法来解决这个问题,但这应该会让你开始。
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, '', [])发布于 2015-04-17 02:36:00
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(',')输出
‘’,'c','b.sc.ssa','b.sc.ssb','b.sb','b.sa‘
发布于 2017-12-12 07:51:56
如果您想让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}https://stackoverflow.com/questions/29689081
复制相似问题