测试所有对象是否具有相同的成员值

时间:2017-08-30 00:20:20

标签: python linux unique membership

我在中有一个简单的课程:

class simple(object):
    def __init__(self, theType, someNum):
        self.theType = theType
        self.someNum = someNum

稍后在我的程序中,我创建了这个类的多个实例,即:

a = simple('A', 1)
b = simple('A', 2)
c = simple('B', 3)
d = simple('B', 4)
e = simple('C', 5)

allThings = [a, b, c, d, e] # Fails "areAllOfSameType(allThings)" check

a = simple('B', 1)
b = simple('B', 2)
c = simple('B', 3)
d = simple('B', 4)
e = simple('B', 5)

allThings = [a, b, c, d, e] # Passes "areAllOfSameType(allThings)" check

我需要测试allThings中的所有元素是否具有simple.theType的相同值。我将如何为此编写通用测试,以便我可以包含新的"类型"将来(即DEF等)并且不必重写我的测试逻辑?我可以想办法通过直方图来做到这一点,但我认为这是一个" pythonic"这样做的方法。

2 个答案:

答案 0 :(得分:3)

使用all()函数将每个对象与第一个项目的类型进行比较:

all(obj.theType == allThings[0].theType for obj in allThings)

如果列表也是空的,也不会有IndexError。

all()短路,所以如果一个对象与另一个对象的类型不同,则循环立即中断并返回False。

答案 1 :(得分:2)

您可以使用itertools recipe for this: all_equal(复制的逐字):

from itertools import groupby

def all_equal(iterable):
    "Returns True if all the elements are equal to each other"
    g = groupby(iterable)
    return next(g, True) and not next(g, False)

然后你可以使用访问theType属性的生成器表达式来调用它:

>>> allThings = [simple('B', 1), simple('B', 2), simple('B', 3), simple('B', 4), simple('B', 5)]
>>> all_equal(inst.theType for inst in allThings)
True

>>> allThings = [simple('A', 1), simple('B', 2), simple('B', 3), simple('B', 4), simple('B', 5)]
>>> all_equal(inst.theType for inst in allThings)
False

鉴于它实际上是作为Python文档中的食谱而放置,似乎它可能是解决此类问题的最佳(或至少推荐)方法之一。