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

Ein*_*nar 64 python list

在我的一些代码中,我将一系列对象放在一个列表中,然后从属性中构建一个额外的列表,这是一个字符串.我需要确定第二个列表中的所有项目是否具有完全相同的值,而不事先知道它是哪个值,并返回一个bool,以便我可以根据结果在我的代码中执行不同的操作.

我事先无法知道属性的名称,这就是为什么我想尽可能地创建通用的东西.

为了使示例清楚,一个称为"all_same"的理想函数将如下工作:

>>> property_list = ["one", "one", "one"]
>>> all_same(property_list)
True
>>> property_list = ["one", "one", "two"]
>>> all_same(property_list)
False
Run Code Online (Sandbox Code Playgroud)

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

Fog*_*ird 124

def all_same(items):
    return all(x == items[0] for x in items)
Run Code Online (Sandbox Code Playgroud)

例:

>>> 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
Run Code Online (Sandbox Code Playgroud)

  • `len(set(items))== 1`更快. (39认同)

whe*_*ies 45

你可以欺骗和使用set:

def all_same( items ):
    return len( set( items ) ) == 1 #== len( items )
Run Code Online (Sandbox Code Playgroud)

或者您可以使用:

def all_same( items ):
    return all( map(lambda x: x == items[0], items ) )
Run Code Online (Sandbox Code Playgroud)

或者如果您正在处理迭代而不是列表:

def all_same( iterable ):
    it_copy = tee( iterable, 1 )
    return len( set( it_copy) ) == 1
Run Code Online (Sandbox Code Playgroud)

  • len(set(items))== 1绝对是最惯用的. (11认同)

小智 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)
Run Code Online (Sandbox Code Playgroud)

以上工作适用于任何可迭代的,而不仅仅是列表,否则您可以使用:

def all_same(L):
  return all(x == L[0] for x in L)
Run Code Online (Sandbox Code Playgroud)

(但是,恕我直言,你不妨使用一般版本 - 它在列表上运行得非常好.)


itm*_*ard 6

最好的方法是使用Python集.你需要all_same像这样定义:

def all_same(items):
    return len(set(items)) < 2
Run Code Online (Sandbox Code Playgroud)

测试:

>>> 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
Run Code Online (Sandbox Code Playgroud)

  • 这对我不起作用,因为我的列表中的元素是字典,无法进行散列 (2认同)

tok*_*and 5

这适用于序列和可迭代对象:

def all_same(items):
  it = iter(items)
  first = next(it, None)
  return all(x == first for x in it)
Run Code Online (Sandbox Code Playgroud)