首先,我是python编程的新手,所以请多多包涵。 我正在尝试编写一个非常简单的代码,将员工分配到最近的工作站。
为此,我创建了两个类,一个Employee
类和一个Workstation
类。它们的属性基本相同,都具有名称和位置(location
属性用整数表示,以保持其简单性)。 Employee
类还具有一个名为workstation
的附加属性,默认情况下将其设置为"not_assigned_yet"
。
这是到目前为止我的代码:
class Workstation:
def __init__(self, name, location):
self.name=name
self.location=location
W1=Workstation("Workstation1", 0)
W2=Workstation("Workstation2", 5)
class Employee:
def __init__(self, name, location,workstation):
self.name=name
self.location=location
self.workstation=workstation
E1=Employee("Employee1", 3, "not_assigned_yet")
E2=Employee("Employee2", 6, "not_assigned_yet" )
我想为Employee
类定义一个方法,该方法找到与Workstation
对象最接近位置的Employee
并将Employee
分配给那个工作站
例如,如果我要将E1
分配给它最近的工作站,结果将或多或少像这样:
E1.workstation=W1.name
那么我该如何将其放入通用代码中?
答案 0 :(得分:1)
首先,您需要使用数组(或字典)。因此,您的代码将如下所示:
W = []
W.append(W1)
W.append(W2)
E = []
E.append(E1)
E.append(E2)
第二,您可以遍历雇主,然后遍历工作站以找到最佳匹配项:
import math
for e in E:
closest_distance = math.inf
closest_workstation = ""
for w in W:
diff = abs(w.location - e.location)
if diff < closest_distance:
closest_distance = diff
closest_workstation = w
e.workstation = closest_workstation.name
for e in E:
print(e.workstation)
如果愿意,可以在员工类的方法中转换上面的代码片段。根据您遵循的设计模式,可以建议(活动记录)或不建议这样做(DAO)。
答案 1 :(得分:0)
非常感谢您的帮助。我最终在arnaldocan和JEX的帮助下找到了问题。 首先,我使用了JEX建议的min()函数来查找最近的工作站(我必须首先创建一个包含所有工作站的不同位置的列表(W))。
def assign(self):
a= (min(W, key=lambda x: abs(x-self.location)))
然后我跟随arnaldocans建议并遍历所有工作站(WW)的列表,如果该列表中具有最接近工作站的整数,则该员工的位置将使用其名称:
def assign(self):
a= (min(W, key=lambda x: abs(x-self.location)))
for w in WW:
if a==w.location:
self.workstation=w.name
print(self.workstation)
几乎全部。我创建了3个工作站和3个在不同位置的员工。当我运行该方法时,每个员工都被分配到最近的工作站。这里有完整的代码:
class Workstation:
def __init__(self, name, location):
self.name=name
self.location=location
W1=Workstation("Workstation1", 0)
W2=Workstation("Workstation2",10)
W3=Workstation("Workstation3", 5)
W = [W1.location, W2.location, W3.location]
WW=[W1, W2, W3]
class Employee:
def __init__(self, name, location,workstation):
self.name=name
self.location=location
self.workstation=workstation
def assign(self):
a= (min(W, key=lambda x: abs(x-self.location)))
for w in WW:
if a==w.location:
self.workstation=w.name
print(self.workstation)
E1=Employee("Employee1", 9, "not_assigned_yet")
E2=Employee("Employee2", 7, "not_assigned_yet" )
E3=Employee("Employee3", 2, "not_assigned_yet" )
E1.assign()
E2.assign()
E3.assign()