【问题标题】:Facing difficulty in python comparing instances of two class objects based on emp_idpython比较基于emp_id的两个类对象的实例面临的困难
【发布时间】:2020-06-21 23:44:55
【问题描述】:

我是 python 新手,在比较从 csv 文件中获取的类对象的实例时遇到问题。我将 person.csv 的数据分配给 Employee 类,将福利.csv 分配给福利类。现在,我需要比较这两个类的实例,即 (emp_id)。 这是我的两个 csv 文件: 人.csv:

emp_id sex  age
1      Male  25
2     Female 26
3      Male   28

好处.csv:

emp_id code type
1       A1  1
1       B20  2
1       A10  1
2       B20  2
3       A10  1
3       C2   2

代码:

class Benefits():
  def __init__(self,emp_id,code,codetype):
    super().__init__()
    self.emp_id = emp_id
    self.code = code
    self.codetype = codetype

class Employee():
  def __init__(self,emp_id,sex,age):
    super().__init__()
    self.emp_id = emp_id
    self.sex = sex
    self.age = age
    self.benefits = []

    def __repr__(self): # specifies how to display an Employee
    return "EMP NO:" + str(self.emp_id) + ",SEX:" + str(self.sex) + ",AGE:" + str(self.age) + ",Benefits:" + str(self.benefits)

  def add_benefits(self,ben):
    self.benefits.append(ben)

dir = os.path.dirname(__file__)
file1 = open(os.path.join(dir,"person.csv"), 'r')
next(file1)
directory = os.path.dirname(__file__)
file2 = open(os.path.join(directory, "benefits.csv"), 'r')
next(file2)
  
for line1 in file1:
    vals1 = list(map(lambda s: s.strip(),line1.split(",")))
    E = Employee(vals1[0],vals1[1],vals1[2])
for line2 in file2:
    vals2 = list(map(lambda s: s.strip(),line2.split(",")))
    B = Benefits(vals2[0],vals2[1],vals2[2])

    if vals1[0] == vals2[0]:  #this condition needs to check for all the emp_id's
        E.add_benefits(Benefits(vals2[0],vals2[1],vals2[2]))
print(E)

但我只得到最后一个 emp_id 的输出,如下所示:

>>>print(E)
EMP NO:3,SEX:Male,AGE:28,Benefits:[A10,C2]

这应该是必需的输出:

EMP NO:1,SEX:Male,AGE:25,Benefits:[A1,B20,A10]
EMP NO:2,SEX:Female,AGE:26,Benefits:[B20]
EMP NO:3,SEX:Male,AGE:28,Benefits:[A10,C2]

谁能帮我解决这个问题。提前致谢。

【问题讨论】:

  • 循环只会产生一个员工...最后一个创建的。所有其他的在每次迭代中都被丢弃。您可以创建一个列表(或者更好的是,从员工 ID 到员工的字典)。或者为员工创建一个专门的容器类(可能使用引擎盖下的字典将 Id 映射到员工)
  • 您需要了解变量是对特定对象的引用。如果您在 for 循环中使用“=”,则您正在重新分配变量。调用类Employee 将只返回一个类的实例。如果需要,您可以将多个实例存储在一个列表中。然后循环它们以打印出来。或者您可以创建一个从 List 类继承的Employees 类,并在那里执行一个 repr 魔术函数。

标签: python csv class object if-statement


【解决方案1】:

这似乎是麻烦点:

for line1 in file1:
    vals1 = list(map(lambda s: s.strip(),line1.split(",")))
    E = Employee(vals1[0],vals1[1],vals1[2])

我可以看到您正在尝试将所有 3 行添加到您的 vals1 列表中,然后打印它。 仅显示 1 行的原因是您在每次迭代期间都重新定义了 vals1 和 E 变量。因此,您实际上不是将数据添加到列表中,而是在每次传递时都将其清除并重写。

如何解决:

创建一个空列表来存储每次迭代时 E 的值,并在程序结束时打印该列表,或者在每次迭代结束时简单地打印 E。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    相关资源
    最近更新 更多