用于存储Employee对象的最佳数据结构?

时间:2018-07-12 17:12:20

标签: python python-3.x

我想创建一个GUI,该GUI允许用户创建新的员工对象并访问它们各自的属性。到目前为止,我的程序只允许一次打印一个对象的信息:

import sys
from PyQt4 import QtGui

class Employee:

  def __init__(self, id, salary):
    self.id = id
    self.salary = salary

  def info(self):
    return "Employee ID: {}\nFull name:{}\nSalary:{}".format(self.id, self.full_name, self.salary)

class Window(QtGui.QMainWindow, Employee):

  def __init__(self):
    super(Window, self).__init__()  #Returns the parent object or the QMainWindow object
    self.setGeometry(50, 50, 500, 300)
    self.setWindowTitle("Employee builder")

    extractAction = QtGui.QAction("&Add Employee", self)
    extractAction.triggered.connect(self.create_employee)

    mainMenu = self.menuBar()
    fileMenu = mainMenu.addMenu('&File')
    fileMenu.addAction(extractAction)

    self.home()

  def home(self):
    self.show()

  def create_employee(self):
    ID, ok = QtGui.QInputDialog.getInt(self, "integer input dualog", "Enter employees id number:")
    pay, ok = QtGui.QInputDialog.getInt(self, "integer input dualog", "Enter employees salary:")

    emp1 = Employee(ID, pay)
    QtGui.QMessageBox.information(None, "Employee information:", emp1.info)

def run():
  app = QtGui.QApplication(sys.argv)
  GUI = Window()
  sys.exit(app.exec_())

run()

我看到的下一个逻辑步骤是调用一个存储每个新创建的员工对象的方法,以便用户可以基于对象ID访问对象信息。在Python中,是否需要创建一个更高级的数据结构(如哈希表)来存储对象?还是我应该只使用字典或列表(字典是哈希表)?我这样做只是为了学习Python和PyQt4 GUI,所以我不希望节省大量字节的员工信息或类似信息。

2 个答案:

答案 0 :(得分:2)

如果您需要高效地查找数据(分摊固定时间)并且方便地通过键查找,则哈希表是一种很好的数据结构。

Python dict使用哈希表,因此它确实可以实现您想要的功能。 (当然,如果您想构建自己的哈希表作为一种学习经验,这并不难。但是您不太可能获得与内置哈希表一样好的性能,尤其是当您使用默认的CPython解释器时。 )


使用dict使您的代码更易于编写和阅读。如果您将employees个对象中的listEmployee作为对象,则要按ID查找一个对象,您必须这样做:

for employee in employees:
    if employee.id == searchid:
        do_stuff(employee)
        break

但是,如果您将dict的每个employee值用作employee.id键,则可以执行以下操作:

employee = employees[searchid]

(当然,在现实生活中的代码中,两个版本都需要多一点处理未找到ID的情况。)

而且效率更高。显然,该循环正在拜访每位员工(好吧,感谢break,我们平均只拜访了其中的一半,但在最坏的情况下仍然拜访了所有员工),但是dict版本只是散列searchid并在哈希表中查找。因此,如果将表的大小设为10000x,则list版本的长度为10000x,但是dict版本仍然有效。


但是,如果您要进行诸如使用id<=20查找所有员工的操作,则哈希表将无济于事。取而代之的是,您想要一个可以按对数时间一分为二的分类集合。

对于静态数据,您可以在开始时进行所有插入操作,然后才进行查询,您可以只使用列表sort(key=operator.attrgetter('id')),然后使用bisect模块进行搜索。

如果您需要在系统的整个生命周期内频繁添加(或删除)条目,则需要一个树状数据结构-红黑树或其他平衡的二进制搜索树,或b树变体之一,或跳过列表等。Python并未附带任何这些,但是PyPI上有不错的实现(或者值得您自己练习)。

也有一些聪明的混合结构,基本上在小规模上像绳索/双端螺栓,但在大尺度上像b树或宽阔的跳绳,甚至更好。这些也可以在PyPI上获得。

答案 1 :(得分:0)

这听起来像是使用字典的时间。 Python中的字典使用哈希表,对于使用特定键(在您的情况下为ID)进行搜索非常有效