当前位置: 首页 > 面试题库 >

Python-检查列表中的所有元素是否相同

邵鸿福
2023-03-14
问题内容

我需要以下功能:

输入:alist

输出:

  • True如果输入列表中的所有元素使用标准相等运算符求值彼此相等;
  • False除此以外。

性能:当然,我不希望产生任何不必要的开销。

我觉得最好:

  • 遍历列表
  • 比较相邻元素
  • 和AND所有结果布尔值

但我不确定最Pythonic的方法是什么。


问题答案:

通用方法:

def checkEqual1(iterator):
    iterator = iter(iterator)
    try:
        first = next(iterator)
    except StopIteration:
        return True
    return all(first == rest for rest in iterator)

单线:

def checkEqual2(iterator):
   return len(set(iterator)) <= 1

也是单线的:

def checkEqual3(lst):
   return lst[1:] == lst[:-1]

这三个版本之间的区别在于:

  1. checkEqual2内容中必须是可哈希的。
  2. checkEqual1并且checkEqual2可以使用任何迭代器,但checkEqual3必须接受序列输入,通常是列表或元组之类的具体容器。
  3. checkEqual1 发现差异后立即停止。
  4. 由于checkEqual1包含更多的Python代码,因此当许多项目在开始时相等时效率较低。
  5. 由于checkEqual2checkEqual3始终执行O(N)复制操作,因此,如果你的大多数输入将返回False,它们将花费更长的时间。
  6. 对于checkEqual2checkEqual3很难适应从a == b到的比较a is b

timeit 结果,对于Python 2.7和(仅s1,s4,s7,s9应该返回True)

s1 = [1] * 5000
s2 = [1] * 4999 + [2]
s3 = [2] + [1]*4999
s4 = [set([9])] * 5000
s5 = [set([9])] * 4999 + [set([10])]
s6 = [set([10])] + [set([9])] * 4999
s7 = [1,1]
s8 = [1,2]
s9 = []

我们得到

      | checkEqual1 | checkEqual2 | checkEqual3  | checkEqualIvo | checkEqual6502 |
|-----|-------------|-------------|--------------|---------------|----------------|
| s1  | 1.19   msec | 348    usec | 183     usec | 51.6    usec  | 121     usec   |
| s2  | 1.17   msec | 376    usec | 185     usec | 50.9    usec  | 118     usec   |
| s3  | 4.17   usec | 348    usec | 120     usec | 264     usec  | 61.3    usec   |
|     |             |             |              |               |                |
| s4  | 1.73   msec |             | 182     usec | 50.5    usec  | 121     usec   |
| s5  | 1.71   msec |             | 181     usec | 50.6    usec  | 125     usec   |
| s6  | 4.29   usec |             | 122     usec | 423     usec  | 61.1    usec   |
|     |             |             |              |               |                |
| s7  | 3.1    usec | 1.4    usec | 1.24    usec | 0.932   usec  | 1.92    usec   |
| s8  | 4.07   usec | 1.54   usec | 1.28    usec | 0.997   usec  | 1.79    usec   |
| s9  | 5.91   usec | 1.25   usec | 0.749   usec | 0.407   usec  | 0.386   usec   |

注意:

# http://stackoverflow.com/q/3844948/
def checkEqualIvo(lst):
    return not lst or lst.count(lst[0]) == len(lst)

# http://stackoverflow.com/q/3844931/
def checkEqual6502(lst):
    return not lst or [lst[0]]*len(lst) == lst


 类似资料:
  • 本文向大家介绍检查列表是否包含Python中的所有唯一元素,包括了检查列表是否包含Python中的所有唯一元素的使用技巧和注意事项,需要的朋友参考一下 python中的列表可以包含所有元素,这些元素可能是唯一的,也可能不是唯一的。但是对于需要特殊元素的情况,例如标记班级不同卷号的出勤率。以下是可以使用的方法。 用 python集是无序,未索引且还包含唯一元素的集合。因此,我们将比较从列表创建的集合

  • 问题内容: 我有这样的df: 以及物品清单: 我的目标是从中获取至少包含2个元素的所有行。 我想出了以下解决方案: 这给了我我想要的,但是就可伸缩性而言,它可能不是最佳的解决方案。是否有任何“向量化”解决方案?谢谢 问题答案: 我会建立一个Series列表,然后应用vectorized : 它给出了预期的结果:

  • 问题内容: 如何检查列表中的元素是否属于同一类型,而又尽可能不检查每个元素? 例如,我想要一个函数来检查此列表中的每个元素是否为整数(显然是错误的): 问题答案: 尝试与结合使用: 您甚至可以根据需要检查多种类型: 并不是说这也会选择继承的类。例如: 如果您 需要 将自己限制为整数,可以使用。但这是 非常 罕见的情况。 您可以编写一个有趣的函数,如果所有其他元素都是同一类型,它将返回序列中第一个元

  • 开始时,所有标志均为0。我使用while循环来检查是否至少有一个元素的标志为0: 如果返回,那么我将继续处理我的列表: 实际上,我想在迭代my_list时移除元素,但不允许在迭代时移除项。 由于我无法在迭代时删除元素,所以我发明了这些标志。但是包含许多项,循环在每个循环中读取所有项,这会消耗大量时间!你有什么建议吗?

  • 问题内容: 由于所有元素均为“ false”,如何返回“ false”? 给定的列表是: 问题答案: 使用: 如果可迭代项中有任何真值,则将返回True。

  • 问题内容: Swift中是否有一个函数可以检查数组的所有元素是否具有相同的值?就我而言,它是一个type数组。我知道我可以使用一个简单的for循环对其进行迭代,我只是想知道是否内置了某些东西并且速度更快。 问题答案: 任何方法都必须遍历所有元素,直到找到另一个元素: 可以使用以下函数来代替显式循环: 如果数组元素是(例如),则可以从数组元素创建一个(从Swift 1.2开始可用),并检查它是否恰好