Python 搜索包含类对象的列表,并删除与类对象的实例变量匹配的类对象
这是在Python3.3中实现的 所以我有两个类: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
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))