gpt4 book ai didi

python - 检查对象(具有某些属性值)是否不在列表中

转载 作者:太空狗 更新时间:2023-10-29 22:29:32 24 4
gpt4 key购买 nike

我是 Python 新手。我正在使用 Python v2.7。

我定义了一个简单的类 Product:

class Product:
def __init__(self, price, height, width):
self.price = price
self.height = height
self.width = width

然后,我创建了一个列表,然后附加了一个 Product 对象:

# empty list
prod_list = []
# append a product to the list, all properties have value 3
prod1 = Product(3,3,3)
prod_list.append(prod1)

然后,我创建了另一个设置相同初始化值(所有 3 个)的 Product 对象:

prod2 = Product(3,3,3)

然后,我想检查 prod_list 是否包含一个 Product 对象,该对象的价格为 3、宽度为 3 且高度为=3,作者:

if prod2 not in prod_list:
print("no product in list has price=3, width=3 & height=3")

我预计没有打印出消息,但它被打印出来了。在 Python 中,如何检查列表中是否没有具有特定属性值的对象?

最佳答案

您需要为您的对象添加一个equality 属性。要获取对象属性,您可以将属性名称传递给 operator.attrgetter,它返回一个包含已获取属性的元组,然后您可以比较这些元组。您也可以使用 __dict__ 属性,它将模块的命名空间作为字典对象提供给您。然后,您可以获得要根据它们比较对象的属性名称。

from operator import attrgetter

class Product:
def __init__(self, price, height, width):
self.price = price
self.height = height
self.width = width

def __eq__(self, val):
attrs = ('width', 'price', 'height')
return attrgetter(*attrs)(self) == attrgetter(*attrs)(val)

def __ne__(self, val):
attrs = ('width', 'price', 'height')
return attrgetter(*attrs)(self) != attrgetter(*attrs)(val)

编辑:

正如@Ashwini 在基于 python wiki 的评论中提到的:

There are no implied relationships among the comparison operators. The truth of x==y does not imply that x!=y is false. Accordingly, when defining __eq__(), one should also define __ne__() so that the operators will behave as expected.

因此,作为一种更全面的方法,我还向对象添加了 __ne__ 属性。如果其中一个属性不等于它在其他对象中的相对属性,它将返回 True。

演示:

prod_list = []
prod1 = Product(3, 3, 3)
prod_list.append(prod1)

prod2 = Product(3, 3, 2)
prod_list.append(prod2)

prod3 = Product(3, 3, 3)
print prod3 in prod_list
True
prod3 = Product(3, 3, 5)
print prod3 in prod_list
False

关于python - 检查对象(具有某些属性值)是否不在列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35694596/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com