python: ทำ StackDict

ข้อมูลชนิดดิกชันนารี่ของไพธอน ดีหลายอย่าง แต่เสียตรงไม่สามารถทำงานแบบ Stack (First in, Last out) ได้

ลองเขียนคลาสง่าย ๆ สร้าง tuple ใน list เพื่อเลียนแบบดิกชันนารี่ที่สามารถเก็บข้อมูลเป็น stack ได้

class StackDict:

  def __init__(self):
    self.data = []
    self._keys = []
    self._items = []

  def __repr__(self):
    return repr(dict(self.data))

  def __setitem__(self, key, item):
    if key in self._keys:
      index = self._keys.index(key)
      self.data[index] = (key, item)
      self._items[index] = item
    else:
      self.data.append((key, item))
      self._keys.append(key)
      self._items.append(item)

  def __getitem__(self, key):
    index = self._keys.index(key)
    return self._items[index]

  def __delitem__(self, key):
    index = self._keys.index(key)
    self.data.remove((key,self._items[index]))
    self._keys.remove(key)
    self._items.remove(self._items[index])

  def dict(self):
    return dict(self.data)

  def has_key(self, key):
    if key in self._keys:
      return True
    else:
      return False

  def keys(self): return self._keys

  def values(self): return self._items

  def items(self): return self.data

  def clear(self): self.__init__()

  def copy(self):
    import copy
    return copy.copy(self)

  def pop(self, key):
    item = self[key]
    del self[key]
    return item

  def getkey(self, index):
    return self._keys[index]

  def getvalue(self, index):
    return self._items[index]

เมธอดยังไม่ครบแบบดิกชันนารี่จริง ๆ เราเอาแค่เมธอดที่เรียกใช้บ่อย

ลองทดสอบดู

>>> d = StackDict()
>>> d['x']=1
>>> d['a']=2
>>> d['1']=3
>>> d['b']=4

>>> d
{'a': 2, 'x': 1, '1': 3, 'b': 4}

>>> d.getkey(0)
'x'

>>> d.data
[('x', 1), ('a', 2), ('1', 3), ('b', 4)]

>>> d.getvalue(0)
1

>>> d.getkey(-1)
'b'

>>> d.getvalue(-1)
4