0.題目
尼古拉喜歡對(duì)一切看到的東西進(jìn)行分類。 有一次,斯蒂芬送了他一個(gè)標(biāo)簽機(jī)作為他的生日禮物爬骤, 機(jī)器人把在船上的每個(gè)面的標(biāo)簽撕了幾個(gè)星期。 從那時(shí)起莫换,他歸類在他的實(shí)驗(yàn)室的所有試劑霞玄, 圖書館的書和在桌子上筆記骤铃。 但后來他得知 python字典,并分類所有索菲亞的機(jī)器人的可能的配置坷剧。 現(xiàn)在惰爬,這些文件被組織在一個(gè)很深的嵌套結(jié)構(gòu), 但索菲亞并不喜歡這樣听隐。讓我們幫助索菲亞扁平化這些字典补鼻。
Python字典是一種可以用來方便地存儲(chǔ)和處理配置的數(shù)據(jù)類型。它允許你通過鍵來創(chuàng)建嵌套結(jié)構(gòu)來存儲(chǔ)數(shù)據(jù)雅任。您將得到一個(gè)字典风范,其中的鍵是字符串,值是字符串或字典沪么。我們的目標(biāo)是使字典扁平化硼婿,但保存的結(jié)構(gòu)中的鍵。其結(jié)果應(yīng)該是一個(gè)字典沒有嵌套的字典禽车。鍵應(yīng)包含原來的字典中的父鍵的路徑寇漫。在路徑中的鍵是由以“/”分開。如果值是一個(gè)空的字典殉摔,那么它應(yīng)該由一個(gè)空字符串("")所取代州胳。
讓我們來看一個(gè)例子:
{
"name": {
"first": "One",
"last": "Drone"
},
"job": "scout",
"recent": {},
"additional": {
"place": {
"zone": "1",
"cell": "2"}
}
}
其結(jié)果將是:
{"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"}
索菲亞已經(jīng)寫了這個(gè)任務(wù)的代碼,但它有一個(gè)漏洞逸月。 你需要找到并修復(fù)這個(gè)漏洞栓撞。
**輸入: **作為字典的一個(gè)原始字典。
**輸出: **作為字典的一個(gè)扁平化字典碗硬。
范例:
flatten({"key": "value"}) == {"key": "value"}
flatten({"key": {"deeper": {"more": {"enough": "value"}}}}) == {"key/deeper/more/enough": "value"}
flatten({"empty": {}}) == {"empty": ""}
1.相關(guān)知識(shí)點(diǎn)
1.1 列表內(nèi)建方法
list.pop(obj=list[-1]) # 移除列表中的一個(gè)元素(默認(rèn)最后一個(gè)元素)瓤湘,并且返回該元素的值。
list.append(obj) # 在列表末尾添加新的對(duì)象恩尾。
1.2 字符串內(nèi)建方法
str.join(sequence) # 將序列中的元素以指定的字符連接生成一個(gè)新的字符串弛说。
1.3 字典更新方法
dict["key"] = value # 指定對(duì)應(yīng)鍵值和值。
1.4 標(biāo)準(zhǔn)內(nèi)建方法
isinstance(object, classinfo) # 如果object是classinfo的一個(gè)實(shí)例或其任意超類的實(shí)例翰意,則返回True木人。在Python 2.X中第二個(gè)參數(shù)也可以是類型對(duì)象,它使這個(gè)函數(shù)在兩個(gè)Pythons中作為另外一個(gè)類型的檢測(cè)工具(isinstance(X, Type)對(duì)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.解法分析
原版代碼中未能對(duì)字典值是否為空進(jìn)行判斷虎囚,也未將空字典改為空字符串加入結(jié)果。
增加判斷字典是否為空蔫磨,并將空字典改為空字符串值加入結(jié)果即可。
5.應(yīng)用場(chǎng)景
在需要為保持系統(tǒng)和文件結(jié)構(gòu)原狀而分析配置文件圃伶,簡(jiǎn)化結(jié)構(gòu)時(shí)會(huì)有用堤如。 可以用自己的規(guī)格輕松地修改這個(gè)想法蒲列。 除此之外,它是一個(gè)能讓人讀懂代碼和查找漏洞的有用的技能搀罢,蝗岖。