Python:确定列表中的所有项目是否是相同的项目

在我的一些代码中,我把一系列的对象放在一个列表中,我从属性中创build了一个额外的列表,这是一个string。 我需要确定在第二个列表中的所有项目是否具有完全相同的值,而不事先知道它是哪个值,并返回一个布尔值,以便我可以根据结果在代码中执行不同的操作。

事先不能知道属性的名称,这就是为什么我试图尽可能通用。

为了让这个例子清楚起见,一个叫做“all_same”的理想function就是这样工作的:

>>> property_list = ["one", "one", "one"] >>> all_same(property_list) True >>> property_list = ["one", "one", "two"] >>> all_same(property_list) False 

我正在考虑制作一个独特的元素列表,然后检查其长度是否为1,但我不确定它是否是最优雅的解决scheme。

 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 

你可以作弊和使用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 

我最初解释你是testing身份(“相同的项目”),但你真的testing平等 (“相同的价值”)。 (如果你正在testing身份,使用而不是==)。

 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) 

(但是,恕我直言,你也可以使用通用版本 – 它在列表上工作得很好)。

最好的方法是使用Python集合。您需要像这样定义all_same

 def all_same(items): return len(set(items)) == 1 

testing:

 >>> def all_same(items): ... return len(set(items)) == 1 ... >>> >>> property_list = ["one", "one", "one"] >>> all_same(property_list) True >>> property_list = ["one", "one", "two"] >>> all_same(property_list) False >>> 

这适用于序列和迭代:

 def all_same(items): it = iter(items) first = next(it, None) return all(x == first for x in it) 

如果您知道值在列表中,这可能会更快。

 def all_same(values): return values.count(values[0]) == len(values) 

在考虑完这个问题之后,我创build了这个代码片段。 我不确定它是否适用于每种情况。

 def all_same(list): list[0]*len(list) == list