อยากได้ดิกฯ แบบที่สามารถเติมข้อมูลได้ ทั้งแนวกว้างและแนวลึก
และให้เป็นข้อมูลแบบ Stack ด้วย
เราใช้วิธีการสร้างลิสต์ในดิกฯ โดย
สร้างคลาสชื่อ ComplexDict
ดังนี้
class ComplexDict: def __init__(self, key): self.__list__ = [] key = str(key) self.__list__.append([key,[]]) def add_key(self, key): if not self.has_key(key): self.__list__.append([key,[]]) def __repr__(self): return repr(dict(self.__list__)) def __getitem__(self, key): _keys = self.keys() if key in _keys: index = _keys.index(key) return self.__list__[index][1] def __delitem__(self, key): if self.has_key(key): self[key] = [] self.__list__.remove([key,[]]) def __setitem__(self, key, val): self.add_key(key) index = self.keys().index(key) self.__list__[index][1] = [val] def keys(self): return [i[0] for i in self.__list__] def values(self): return [i[1] for i in self.__list__] def has_key(self, key): if key in self.keys(): return True else: return False
ทดสอบ
>>> s=ComplexDict('a') >>> s {'a': []} >>> s.add_key('b') >>> s {'a': [], 'b': []} >>> s['a']=1 >>> s['a'].append(2) >>> s {'a': [1, 2], 'b': []} >>> s['a']=2 >>> s {'a': [2], 'b': []} >>> s['b']=ComplexDict('c') >>> s {'a': [2], 'b': [{'c': []}]} >>> s.keys() ['a', 'b'] >>> s.values() [[2], [{'c': []}]] >>> s.__list__ [['a', [2]], ['b', [{'c': []}]]]
ข้อเสียคือยังเข้าถึงข้อมูลยาก
>>> s['b'] [{'c': []}] >>> s['b'][0]['c'] [] >>> s['b'][0]['c'] = 5 >>> s['b'][0]['c'] [5] >>> s {'a': [2], 'b': [{'c': [5]}]} >>>