簡體   English   中英

對象之間的比較匹配,但對象的 arrays 之間不匹配

[英]Comparison between objects matchs, but not between arrays of objects

所以我遇到的問題是在比較 Class House的對象時,一個對象是相互的。


    def __init__(self, door: str, address: str, rooms: List[room],
                 garaje=None, number=None):
        self.door = door
        self.address = address
        # ensure and deserialize if needed the list of rooms
        try:
            if all(isinstance(room, dict) for room in rooms):
                rooms = list(map(room.from_json, rooms))
                # deserialize rooms
            assert all(isinstance(room, Room) for room in rooms)
        except AssertionError as e:
            logger.error("Rooms incorrect")
            raise e
        self.rooms = rooms
        self.garaje = garaje
        self.number = number

    def __eq__(self, other):
        '''
        Two houses instances will be equal when at least following values match:
         door,
         address
         rooms
        '''
        if not isinstance(other, House):
            return NotImplemented
        return (self.door == other.door and
                self.address == other.address and
                self.rooms == other.rooms)

    def __hash__(self):
        return hash((self.door, self.address, self.rooms))


    @classmethod
    def from_json(cls, data):
        return cls(**data)

class House包含基於 Room Class 的房間對象列表:

class Room():

    def __init__(self, name: str, description: str, windows: list = None, bahtroom: bool = True,
                 , room_id: int = None, house_number: int = None):
        self.name = name
        self.description = description
        self.windows = windows
        self.bathroom = bathroom
        self.room_id = room_id
        self.house_number = house_number

    def __eq__(self, other):
        """Two room instances will be equal when at least following values match
         name,
         description,
         windows,
         bathroom
        """

        if not isinstance(other, Room):
            return NotImplemented

        return (self.name == other.name and
                self.description == other.description and
                self.windows == other.windows and
                self.bathroom == other.bathroom 
                )

    def __hash__(self):
        return hash((self.name, self.descritpion, self.windows, self.bathroom))

    @classmethod
    def from_json(cls, data):
        return cls(**data)

比較房屋結果時,由於房間列表中的差異,它們不相等。 在列表中比較它們時,房間是不同的:

自27間

[<housing.classes.Room object at 0x7f465f6f83c8>, <housing.classes.Room object at 0x7f465f6f8710>, <housing.classes.Room object at 0x7f465f6f8550>, <housing.classes.Room object at 0x7f465f6f8978>, <housing.classes.Room object at 0x7f465f6f8048>, <housing.classes.Room object at 0x7f465f6f8a20>, <housing.classes.Room object at 0x7f465f6f8518>, <housing.classes.Room object at 0x7f465f6f8898>, <housing.classes.Room object at 0x7f465f6f87b8>, <housing.classes.Room object at 0x7f465f6f84a8>, <housing.classes.Room object at 0x7f465f6f8278>, <housing.classes.Room object at 0x7f465f6f8c50>, <housing.classes.Room object at 0x7f465f6f8940>, <housing.classes.Room object at 0x7f465f6f86a0>, <housing.classes.Room object at 0x7f465f6f8320>, <housing.classes.Room object at 0x7f465f6f8c18>, <housing.classes.Room object at 0x7f465f6f8a58>, <housing.classes.Room object at 0x7f465f6f80b8>, <housing.classes.Room object at 0x7f465f6f8828>, <housing.classes.Room object at 0x7f465f6f8b70>, <housing.classes.Room object at 0x7f465f6f85f8>, <housing.classes.Room object at 0x7f465f6f81d0>, <housing.classes.Room object at 0x7f465f6f8358>, <housing.classes.Room object at 0x7f465f6f8240>, <housing.classes.Room object at 0x7f465f6f8128>, <housing.classes.Room object at 0x7f465f6f8400>, <housing.classes.Room object at 0x7f465f6f8668>]

其他 27 間客房

[<housing.classes.Room object at 0x7f465f6f1470>, <housing.classes.Room object at 0x7f465f6f1978>, <housing.classes.Room object at 0x7f465f6f1f98>, <housing.classes.Room object at 0x7f465f6f1d68>, <housing.classes.Room object at 0x7f465f6f1a58>, <housing.classes.Room object at 0x7f465f6f1cf8>, <housing.classes.Room object at 0x7f465f6f11d0>, <housing.classes.Room object at 0x7f465f6f1438>, <housing.classes.Room object at 0x7f465f6f1898>, <housing.classes.Room object at 0x7f465f6f1ef0>, <housing.classes.Room object at 0x7f465f6f10f0>, <housing.classes.Room object at 0x7f465f6f1198>, <housing.classes.Room object at 0x7f465f6f1240>, <housing.classes.Room object at 0x7f465f6f18d0>, <housing.classes.Room object at 0x7f465f6f17f0>, <housing.classes.Room object at 0x7f465f6f15c0>, <housing.classes.Room object at 0x7f465f6f1828>, <housing.classes.Room object at 0x7f465f6f1518>, <housing.classes.Room object at 0x7f465f6f13c8>, <housing.classes.Room object at 0x7f465f6f1f28>, <housing.classes.Room object at 0x7f465f6f1160>, <housing.classes.Room object at 0x7f465f6f1860>, <housing.classes.Room object at 0x7f465f6f12e8>, <housing.classes.Room object at 0x7f465f6f17b8>, <housing.classes.Room object at 0x7f465f6f1ba8>, <housing.classes.Room object at 0x7f465f6f1400>, <housing.classes.Room object at 0x7f465f6f14a8>]

但是在比較每個房間列表中的房間時,我不斷發現self中的所有房間都存在於other中。

作為解決方法,我在__eq__House class 中添加了一個討厭的檢查,看起來像這樣:

    def __eq__(self, other):
        '''
        Two houses instances will be equal when at least following values match:
         door,
         address
         rooms
        '''
        if not isinstance(other, House):
            return NotImplemented
        rooms_from_other = True
        rooms_from_self = True
        for room in self.rooms:
            if room not in other.rooms:
                rooms_from_self = False
                break
        for room in other.rooms:
            if room not in self.rooms:
                rooms_from_other = False
                break
        return (self.door == other.door and
                self.address == other.address and
                rooms_from_other and rooms_from_self)

這樣做的好方法是什么,為什么我的房間對象在直接比較但不在列表中時是相等的?

謝謝。

很可能 2 個房間列表的排序方式不同? (您的代碼沒有顯示您如何構建它們)。

您可以先對 2 個列表進行排序,然后他們比較排序后的列表。

return (self.door == other.door and
        self.address == other.address and
        sorted(self.rooms) == sorted(other.rooms))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM