如何比较两个元素为Car对象列表的等长pandas.Series,判断对应行对象是否存在
问题解决方法
问题根源
Python 自定义类默认的成员判断(in操作符)、相等判断(==)都是基于实例的内存地址实现的,不会主动比对类的属性。你代码中的car1和carB虽然品牌、颜色、里程完全一致,但属于两个独立创建的实例,内存地址不同,因此car1 in [carB]会直接返回False,这就是运行结果全为False的原因。
解决方案1:给Car类自定义相等判断规则(推荐)
给Car类新增__eq__魔法方法,自定义实例相等的判断逻辑,后续所有相等判断、成员存在性判断都会自动复用该规则:
class Car: def __init__(self, brand, color, mileage): self.brand = brand self.color = color self.mileage = mileage # 新增相等判断逻辑 def __eq__(self, other): if not isinstance(other, Car): return False return self.brand == other.brand and self.color == other.color and self.mileage == other.mileage
新增该方法后,你原有的compare_parkings函数无需修改,只需要在得到二维结果后压平为一维列表,即可得到你预期的输出:
diff = compare_parkings(parking1, parking2) # 压平二维列表 diff = [item for level in diff for item in level] # 此时diff = [True, False, False, True],符合预期
解决方案2:不修改Car类,直接修改比对逻辑
如果你不想改动原有Car类的实现,可以直接修改对比函数里的判断逻辑,手动比对属性判断车辆是否存在:
def compare_parkings(park1, park2): diff = list() for level1, level2 in zip(park1, park2): for car in level1: # 手动遍历比对属性判断是否存在 exists = any(c.brand == car.brand and c.color == car.color and c.mileage == car.mileage for c in level2) diff.append(exists) return diff
直接运行该函数即可得到你预期的一维结果[True, False, False, True]。
内容的提问来源于stack exchange,提问作者Hamouza
相关产品推荐
相关产品推荐

