使用 Python 內建的 defaultdict 方法可以輕鬆定義一個樹的資料結構。
簡單的說樹也可以是一個字典資料結構
1 |
def tree(): return defaultdict(tree) |
這就是全部,就一行程式碼。
如果你繼續下面的程式碼,需要先引入
1 |
from collections import defaultdict |
例項
JSON-esque
現在我們建立一個 JSON-esque 巢狀字典無需顯式的建立子字典:
1 2 3 |
users = tree() users['harold']['username'] = 'hrldcpr' users['handler']['username'] = 'matthandlersux' |
然後可通過 <code>print(json.dumps(users))</code> 來列印 JSON 資料,結果如下:
1 |
{"harold": {"username": "hrldcpr"}, "handler": {"username": "matthandlersux"}} |
無需賦值
我們不需要通過賦值就可以建立結構:
1 2 3 4 5 6 7 8 |
taxonomy = tree() taxonomy['Animalia']['Chordata']['Mammalia']['Carnivora']['Felidae']['Felis']['cat'] taxonomy['Animalia']['Chordata']['Mammalia']['Carnivora']['Felidae']['Panthera']['lion'] taxonomy['Animalia']['Chordata']['Mammalia']['Carnivora']['Canidae']['Canis']['dog'] taxonomy['Animalia']['Chordata']['Mammalia']['Carnivora']['Canidae']['Canis']['coyote'] taxonomy['Plantae']['Solanales']['Solanaceae']['Solanum']['tomato'] taxonomy['Plantae']['Solanales']['Solanaceae']['Solanum']['potato'] taxonomy['Plantae']['Solanales']['Convolvulaceae']['Ipomoea']['sweet potato'] |
要列印有好的資訊,需要轉成標準的字典物件:
1 |
def dicts(t): return {k: dicts(t[k]) for k in t} |
現在可通過 pprint(dicts(taxonomy)) 進行列印了
:
1 2 3 4 5 6 7 |
{'Animalia': {'Chordata': {'Mammalia': {'Carnivora': {'Canidae': {'Canis': {'coyote': {}, 'dog': {}}}, 'Felidae': {'Felis': {'cat': {}}, 'Panthera': {'lion': {}}}}}}}, 'Plantae': {'Solanales': {'Convolvulaceae': {'Ipomoea': {'sweet potato': {}}}, 'Solanaceae': {'Solanum': {'potato': {}, 'tomato': {}}}}}} |
子結構也被當作是字典物件了,而葉子節點是一個空的字典物件
迭代
可以使用有趣的方法對樹進行迭代。
例如我們解析一個動物的列表並新增到之前定義的 taxonomy 中,我們可以使用如下程式碼:
1 2 |
add(taxonomy, 'Animalia,Chordata,Mammalia,Cetacea,Balaenopteridae,Balaenoptera,blue whale'.split(',')) |
簡化實現:
1 2 3 |
def add(t, keys): for key in keys: t = t[key] |
我們仍然無需賦值:
1 2 3 4 5 6 7 8 |
{'Animalia': {'Chordata': {'Mammalia': {'Carnivora': {'Canidae': {'Canis': {'coyote': {}, 'dog': {}}}, 'Felidae': {'Felis': {'cat': {}}, 'Panthera': {'lion': {}}}}, 'Cetacea': {'Balaenopteridae': {'Balaenoptera': {'blue whale': {}}}}}}}, 'Plantae': {'Solanales': {'Convolvulaceae': {'Ipomoea': {'sweet potato': {}}}, 'Solanaceae': {'Solanum': {'potato': {}, 'tomato': {}}}}}} |
結論
上面提及的這些可能用處不大,只是做了一些有意思的程式碼。
如果你喜歡 Python 的話,把這個當成是樂趣來理解。