繁体   English   中英

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

[英]Can sum() be used like a hash

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

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检查对象身份,而不是相等性( link )。

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可以像哈希一样使用吗?

是的, 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个元素除外)”

一个内置的工具是collections.Counter() 在内部,它使用快速散列来累加计数。 在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})

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM