Python 搜索包含类对象的列表,并删除与类对象的实例变量匹配的类对象

Python 搜索包含类对象的列表,并删除与类对象的实例变量匹配的类对象,python,python-3.x,Python,Python 3.x,这是在Python3.3中实现的 所以我有两个类:Employee和Zone区域获取我创建的员工对象,并将其名称和ID放入列表。我希望remove\u employee方法以字符串形式获取员工的ID,找到与ID匹配的员工,并将其从列表中删除。以下是我目前掌握的情况: class Employee: employee_count = 0 def __init__(self, name, employee_id): self._name = name sel

这是在Python3.3中实现的

所以我有两个类:
Employee
Zone
<代码>区域获取我创建的
员工
对象,并将其
名称
ID
放入
列表
。我希望
remove\u employee
方法以字符串形式获取员工的
ID
,找到与
ID
匹配的员工,并将其从列表中删除。以下是我目前掌握的情况:

class Employee:
employee_count = 0

    def __init__(self, name, employee_id):
        self._name = name
        self._employee_id = employee_id
        Employee.employee_count += 1

    def get_employee_id(self):
        return self._employee_id


class Zone:

    def __init__(self, name="Kitchen", employees=[]):
        self._name = name
        self._employees = employees

    def add_employee(self, employee):
        self._employees += [employee]

    def remove_employee(self, employee_id):
        for employee_id in self._employees:
            self._employees.remove(employee_id)

    def number_of_employees(self):
        return len(self._employees)
当我试着运行这个时:

John = Employee('John', 'F12345')
Jack = Employee('Jack', 'F23514')
Jane = Employee('Jane', 'F10253')
Kitchen = Zone()
Kitchen.add_employee(John)
Kitchen.add_employee(Jack)
Kitchen.add_employee(Jane)
Kitchen.remove_employee('F12345') #John's ID
它从列表中删除了约翰和简,而不仅仅是约翰。我对编程非常陌生,我完全被如何编写
remove\u method()
难住了


任何帮助都将不胜感激

remove_employee
中,实际上不会检查员工ID是否与循环中的当前值匹配。此外,您不应该修改正在迭代的列表;它会引起各种各样的问题。似乎你打算这样做:

def remove_employee(self, employee_id):
    employees = []
    for employee in self._employees:
        if employee._employee_id != employee_id:
            employees.append(employee)
    self._employees = employees
这可以通过一种叫做列表理解的方式大大缩短:

def remove_employee(self, employee_id):
    self._employees = [e for e in self._employees if e._employee_id != employee_id]
然而,如果您使用适当的数据结构来存储员工,整个过程将更加简单,这是一个dict,由ID键控,而不是列表。例如:

class Zone:
    def __init__(self, name="Kitchen", employees=None):
        self._name = name
        self._employees = employees or {}

    def add_employee(self, employee):
        self._employees[employee._employee_id] = employee

    def remove_employee(self, employee_id):
        self._employees.pop(employee_id)

    def number_of_employees(self):
        return len(self._employees)

问题是您正在使用

适用于self.\u employees中的员工id

以及解雇员工

您应该改为执行以下操作:

def remove_employee(self, employee_id):
    for employee in self._employees:
        if employee.get_employee_id() == employee_id:
            self._employees.remove(employee)
或者更好的过滤器!=)


这不是直接的问题,但要注意
区域的问题。我认为这些解决方案会因创建/附加额外列表而增加开销。为什么不在线修改列表?因为我给出的原因:您不应该修改正在迭代的列表。有关原因的详细解释,请参阅。@mattsap:如此小的列表不会对RAM使用产生明显的影响。但是,可能需要修改现有的
self.\u员工
列表,而不是替换它。这可以通过切片分配轻松实现:
self.\u employees[:]=employees
def remove_employee(self, employee_id):
        self.employees = list(filter(lambda x: x.get_employee_id() != employee_id))