ได้รับ nested list เราต้องการแปลงเป็น dictionary ที่องค์ประกอบของมันสามารถถือเป็นส่วนหนึ่งของโครงสร้างข้อมูลต้นไม้ (tree) ในบทความนี้เราจะดู 2 วิธีในการแปลง nested list เป็น dictionary ที่องค์ประกอบแสดงโครงสร้างแบบต้นไม้
การใช้ Slicing
เรากลับลำดับรายการในลิสต์โดย slicing แล้วตรวจสอบว่ารายการอยู่ในลิสต์หรือไม่ ถ้าไม่ได้อยู่เราข้ามไป ถ้าอยู่เราเพิ่มเข้าไปใน tree
ตัวอย่าง
def CreateTree(lst):
new_tree = {}
for list_item in lst:
currTree = new_tree
for key in list_item[::-1]:
if key not in currTree:
currTree[key] = {}
currTree = currTree[key]
return new_tree
# Given list
listA = [['X'], ['Y', 'X'], ['Z', 'X'], ['P', 'Z', 'X']]
print(CreateTree(listA))
การรันโค้ดด้านบนให้ผลลัพธ์ดังนี้:
ผลลัพธ์
{'X': {'Y': {}, 'Z': {'P': {}}}}
การใช้ reduce และ getitem
เราใช้โมดูล functools และ operator เพื่อได้ฟังก์ชัน reduce และ getitem โดยใช้ฟังก์ชันเหล่านี้เรากำหนดสองฟังก์ชันเพื่อดึงรายการจากลิสต์และตั้งค่ารายการเข้าไปในโครงสร้างต้นไม้ ที่นี่เรายังใช้วิธี slicing เพื่อกลับลำดับองค์ประกอบของลิสต์แล้วนำฟังก์ชันสองตัวที่สร้างไปใช้สร้าง dictionary ที่องค์ประกอบเป็นโครงสร้างต้นไม้
ตัวอย่าง
from functools import reduce
from operator import getitem
def getTree(tree, mappings):
return reduce(getitem, mappings, tree)
def setTree(tree, mappings):
getTree(tree, mappings[:-1])[mappings[-1]] = dict()
# Given list
lst = [['X'], ['Y', 'X'], ['Z', 'X'], ['P', 'Z', 'X']]
tree = {}
for i in lst:
setTree(tree, i[::-1])
print(tree)
การรันโค้ดด้านบนให้ผลลัพธ์ดังนี้:
ผลลัพธ์
{'X': {'Y': {}, 'Z': {'P': {}}}}