在我的一些代码中,我将一系列对象放在一个列表中,然后从属性中构建一个额外的列表,这是一个字符串。我需要确定第二个列表中的所有项目是否具有完全相同的值,而不事先知道它是哪个值,并返回一个bool,以便我可以根据结果在代码中执行不同的操作。
我事先无法知道这些属性的名称,这就是为什么我要尽可能地制作一些通用的东西。
为了使示例清晰,一个名为“all_same”的理想函数将如下工作:
>>> property_list = ["one", "one", "one"]
>>> all_same(property_list)
True
>>> property_list = ["one", "one", "two"]
>>> all_same(property_list)
False
我正在考虑制作一个独特元素列表,然后检查它的长度是否为1,但我不确定它是否是最优雅的解决方案。
答案 0 :(得分:118)
def all_same(items):
return all(x == items[0] for x in items)
示例:强>
>>> def all_same(items):
... return all(x == items[0] for x in items)
...
>>> property_list = ["one", "one", "one"]
>>> all_same(property_list)
True
>>> property_list = ["one", "one", "two"]
>>> all_same(property_list)
False
>>> all_same([])
True
答案 1 :(得分:43)
你可以作弊并使用set
:
def all_same( items ):
return len( set( items ) ) == 1 #== len( items )
或者您可以使用:
def all_same( items ):
return all( map(lambda x: x == items[0], items ) )
或者如果您正在处理迭代而不是列表:
def all_same( iterable ):
it_copy = tee( iterable, 1 )
return len( set( it_copy) ) == 1
答案 2 :(得分:9)
我最初将您解释为测试身份(“相同项目”),但您确实在测试相等(“相同值”)。 (如果您正在测试身份,请使用 而不是==。)
def all_same(items):
it = iter(items)
for first in it:
break
else:
return True # empty case, note all([]) == True
return all(x == first for x in it)
以上适用于任何可迭代的,而不仅仅是列表,否则您可以使用:
def all_same(L):
return all(x == L[0] for x in L)
(但是,恕我直言,你不妨使用一般版本 - 它在列表上运行得非常好。)
答案 3 :(得分:5)
最好的方法是使用Python集。你需要像这样定义all_same
:
def all_same(items):
return len(set(items)) < 2
<强>测试强>
>>> def all_same(items):
... return len(set(items)) < 2
...
>>>
>>> property_list = ["one", "one", "one"]
>>> all_same(property_list)
True
>>> property_list = ["one", "one", "two"]
>>> all_same(property_list)
False
>>> property_list = []
>>> all_same(property_list)
True
答案 4 :(得分:4)
这适用于序列和迭代:
def all_same(items):
it = iter(items)
first = next(it, None)
return all(x == first for x in it)
答案 5 :(得分:1)
如果您知道值在列表中,则可能会更快。
def all_same(values):
return values.count(values[0]) == len(values)
答案 6 :(得分:0)
在考虑完之后,我为同一个问题创建了这段代码。我不确定它是否适用于所有情况。
def all_same(list):
list[0]*len(list) == list