0.题目
尼古拉喜欢对一切看到的东西进行分类。 有一次,斯蒂芬送了他一个标签机作为他的生日礼物, 机器人把在船上的每个面的标签撕了几个星期。 从那时起,他归类在他的实验室的所有试剂, 图书馆的书和在桌子上笔记。 但后来他得知 python字典,并分类所有索菲亚的机器人的可能的配置。 现在,这些文件被组织在一个很深的嵌套结构, 但索菲亚并不喜欢这样。让我们帮助索菲亚扁平化这些字典。
Python字典是一种可以用来方便地存储和处理配置的数据类型。它允许你通过键来创建嵌套结构来存储数据。您将得到一个字典,其中的键是字符串,值是字符串或字典。我们的目标是使字典扁平化,但保存的结构中的键。其结果应该是一个字典没有嵌套的字典。键应包含原来的字典中的父键的路径。在路径中的键是由以“/”分开。如果值是一个空的字典,那么它应该由一个空字符串("")所取代。
让我们来看一个例子:
{
"name": {
"first": "One",
"last": "Drone"
},
"job": "scout",
"recent": {},
"additional": {
"place": {
"zone": "1",
"cell": "2"}
}
}
其结果将是:
{"name/first": "One", #one parent
"name/last": "Drone",
"job": "scout", #root key
"recent": "", #empty dict
"additional/place/zone": "1", #third level
"additional/place/cell": "2"}
索菲亚已经写了这个任务的代码,但它有一个漏洞。 你需要找到并修复这个漏洞。
**输入: **作为字典的一个原始字典。
**输出: **作为字典的一个扁平化字典。
范例:
flatten({"key": "value"}) == {"key": "value"}
flatten({"key": {"deeper": {"more": {"enough": "value"}}}}) == {"key/deeper/more/enough": "value"}
flatten({"empty": {}}) == {"empty": ""}
1.相关知识点
1.1 列表内建方法
list.pop(obj=list[-1]) # 移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。
list.append(obj) # 在列表末尾添加新的对象。
1.2 字符串内建方法
str.join(sequence) # 将序列中的元素以指定的字符连接生成一个新的字符串。
1.3 字典更新方法
dict["key"] = value # 指定对应键值和值。
1.4 标准内建方法
isinstance(object, classinfo) # 如果object是classinfo的一个实例或其任意超类的实例,则返回True。在Python 2.X中第二个参数也可以是类型对象,它使这个函数在两个Pythons中作为另外一个类型的检测工具(isinstance(X, Type)对type(X)是类型)。
2.需要修改的源码
def flatten(dictionary):
stack = [((), dictionary)]
result = {}
while stack:
path, current = stack.pop()
for k, v in current.items():
if isinstance(v, dict):
stack.append((path + (k,), v))
else:
result["/".join((path + (k,)))] = v
return result
3.修正后的源码
def flatten(dictionary):
stack = [((), dictionary)]
result = {}
while stack:
path, current = stack.pop()
for k, v in current.items():
if isinstance(v, dict):
if len(v) == 0:
result["/".join((path + (k,)))] = ""
else:
stack.append((path + (k,), v))
else:
result["/".join((path + (k,)))] = v
return result
4.解法分析
原版代码中未能对字典值是否为空进行判断,也未将空字典改为空字符串加入结果。
增加判断字典是否为空,并将空字典改为空字符串值加入结果即可。
5.应用场景
在需要为保持系统和文件结构原状而分析配置文件,简化结构时会有用。 可以用自己的规格轻松地修改这个想法。 除此之外,它是一个能让人读懂代码和查找漏洞的有用的技能,。