簡體   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