sum() 可以像哈希一样使用



我想检查两个列表的总和是否相同。

lst1 = [1, 2, 3, 4]
lst2 = [0, 3, 3, 4]
if sum(lst1) == sum(lst2):
    return true

此处的总和返回 true。如果我对列表进行哈希处理,我会得到不同的值,但哈希在计算上是昂贵的。我只想检查两个列表中的元素是否相同(只有 1 个元素除外(。我正在使用二叉搜索技术来划分列表,然后检查哈希。如果哈希不同,我正在检查它是否不止一次。但正如我所说,哈希在计算上是昂贵的。顺序在这里也很重要。谢谢

首先,is 不是应用程序的逻辑正确语法;请改用 ==。参考这篇文章以了解有关差异的更多信息:Python 中的"=="和"is"之间有区别吗?

def checksum(lst1, lst2):
    return sum(lst1) == sum(lst2):
list1 = [1, 2, 3, 4]
list2 = [0, 3, 3, 4]
checksum(list1,list2)

这是比较校验和的正确代码(在本例中显然是正确的(。

如果您正在寻找不同的东西,例如查找列表中的项目是否在元素上相同,那么直接的答案将是

return lst1 == lst2

is检查对象标识,而不是相等性(链接(。

sum不区分仅对最终结果求和的元素。如果需要区分容器的元素,可以使用set

set(lst1) == set(lst2) # ignores counts of elements

或者,如果您对元素计数敏感,请使用collections.Counter

collections.Counter(lst2) == collections.Counter(lst1) # False
collections.Counter(lst1) == collections.Counter(lst1) # True

这需要您循环访问列表。


根据你到底在追求什么,你也可以

hash(tuple(lst1)) == hash(tuple(lst2))

这会检查包含的元素及其顺序(也许您不关心顺序(并且非常有效。您必须对tuple进行转换list因为它不是不可变的,因此无法进行哈希处理。

hash(tuple)似乎要快得多,但我不清楚你的最终目标到底是什么

%timeit hash(tuple(lst1)) == hash(tuple(lst2))
1000000 loops, best of 3: 408 ns per loop
%timeit collections.Counter(lst2) == collections.Counter(lst1)
100000 loops, best of 3: 5.58 µs per loop

总和可以像哈希一样使用吗?

是的,sum(( 函数可以用作整数列表或元组的哈希。

哈希在计算上是否昂贵?

有趣的是,对于整数元组,hash(( 的性能优于 sum((:

$ python2.7 -m timeit -s "data = (1, 2, 3, 4)" "sum(data)"
10000000 loops, best of 3: 0.113 usec per loop
$ python2.7 -m timeit -s "data = (1, 2, 3, 4)" "hash(data)"
10000000 loops, best of 3: 0.0569 usec per loop

如何比较无序列表

所述的问题是"如何比较两个列表中的元素是否相同(仅 1 个元素除外(">

用于执行此操作的内置工具是集合。计数器((。 在内部,它使用快速哈希来累积计数。 在Python 3中,它由用C编写的代码加速。 它使用单个 O(n( 传递而不是 O(log n( 二进制搜索。

>>> from collections import Counter
>>> list1 = [1, 2, 3, 4]
>>> list2 = [0, 3, 3, 4]
>>> c1 = Counter(list1)
>>> c2 = Counter(list2)
>>> c1 == c2
False
>>> c1 - c2
Counter({1: 1, 2: 1})
>>> c2 - c1
Counter({0: 1, 3: 1})

随着列表大小的增大,各种方法的差异将变得更加明显。

相关内容

  • 没有找到相关文章

最新更新