测试所有对象是否具有相同的成员值
Test if all objects have same member value
我在 python 中有一个简单的 class:
class simple(object):
def __init__(self, theType, someNum):
self.theType = theType
self.someNum = someNum
稍后在我的程序中,我创建了这个 class 的多个实例化,即:
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 是否具有相同的值。我将如何为此编写一个通用测试,以便我可以在将来包含新的 "types"(即 D
、E
、F
等)而不必重写我的测试逻辑?我可以想出一种通过直方图来做到这一点的方法,但我认为有一种 "pythonic" 方法可以做到这一点。
只需将每个对象与第一个项目的类型进行比较,使用 all()
函数:
all(obj.theType == allThings[0].theType for obj in allThings)
如果列表为空,则不会有IndexError
。
all()
短路,因此如果一个对象与另一个对象的类型不同,循环会立即中断并且 returns False
.
您可以使用 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 文档中实际上将其作为配方放入,看来它可能是解决此类问题的最佳(或至少推荐)方法之一。
我在 python 中有一个简单的 class:
class simple(object):
def __init__(self, theType, someNum):
self.theType = theType
self.someNum = someNum
稍后在我的程序中,我创建了这个 class 的多个实例化,即:
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 是否具有相同的值。我将如何为此编写一个通用测试,以便我可以在将来包含新的 "types"(即 D
、E
、F
等)而不必重写我的测试逻辑?我可以想出一种通过直方图来做到这一点的方法,但我认为有一种 "pythonic" 方法可以做到这一点。
只需将每个对象与第一个项目的类型进行比较,使用 all()
函数:
all(obj.theType == allThings[0].theType for obj in allThings)
如果列表为空,则不会有IndexError
。
all()
短路,因此如果一个对象与另一个对象的类型不同,循环会立即中断并且 returns False
.
您可以使用 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 文档中实际上将其作为配方放入,看来它可能是解决此类问题的最佳(或至少推荐)方法之一。