我需要一个接受 list
并输出 True
如果输入列表中的所有元素使用标准相等运算符评估为彼此相等的函数和 False
除此以外。
我觉得最好遍历比较相邻元素的列表,然后 AND
所有结果布尔值。但我不确定什么是最 Pythonic 的方式来做到这一点。
原文由 max 发布,翻译遵循 CC BY-SA 4.0 许可协议
我需要一个接受 list
并输出 True
如果输入列表中的所有元素使用标准相等运算符评估为彼此相等的函数和 False
除此以外。
我觉得最好遍历比较相邻元素的列表,然后 AND
所有结果布尔值。但我不确定什么是最 Pythonic 的方式来做到这一点。
原文由 max 发布,翻译遵循 CC BY-SA 4.0 许可协议
比使用 set() 对序列(而不是可迭代对象)起作用更快的解决方案是简单地计算第一个元素。这假设列表是非空的(但这很容易检查,并自己决定空列表中的结果应该是什么)
x.count(x[0]) == len(x)
一些简单的基准:
>>> timeit.timeit('len(set(s1))<=1', 's1=[1]*5000', number=10000)
1.4383411407470703
>>> timeit.timeit('len(set(s1))<=1', 's1=[1]*4999+[2]', number=10000)
1.4765670299530029
>>> timeit.timeit('s1.count(s1[0])==len(s1)', 's1=[1]*5000', number=10000)
0.26274609565734863
>>> timeit.timeit('s1.count(s1[0])==len(s1)', 's1=[1]*4999+[2]', number=10000)
0.25654196739196777
原文由 Ivo van der Wijk 发布,翻译遵循 CC BY-SA 4.0 许可协议
2 回答5k 阅读✓ 已解决
2 回答1k 阅读✓ 已解决
4 回答937 阅读✓ 已解决
3 回答1.1k 阅读✓ 已解决
3 回答1.1k 阅读✓ 已解决
1 回答1.7k 阅读✓ 已解决
1 回答1.2k 阅读✓ 已解决
使用
itertools.groupby
(见itertools
食谱):或者没有
groupby
:您可能会考虑多种替代单线:
但它们有一些缺点,即:
all_equal
和all_equal2
可以使用任何迭代器,但其他迭代器必须采用序列输入,通常是具体的容器,如列表或元组。all_equal
和all_equal3
一旦发现差异(所谓的“ 短路”)就停止,而所有替代方案都需要遍历整个列表,即使你可以告诉答案是False
只需查看前两个元素即可。all_equal2
中,内容必须是可 散列 的。例如,列表列表将引发TypeError
。all_equal2
(在最坏的情况下)和all_equal_6502
创建列表的副本,这意味着您需要使用双倍的内存。在 Python 3.9 上,使用
perfplot
,我们得到这些计时(较低的Runtime [s]
更好):