我想检查两个列表的总和是否相同。
lst1 = [1 2 3 4]
lst2 = [0 3 3 4]
if sum(lst1) == sum(lst2):
return true
这里总和返回true。如果我散列列表,我得到不同的值,但散列计算成本很高。 我只想检查两个列表中的元素是否相同(只有1个元素除外)。我正在使用二进制搜索技术划分列表然后检查哈希。如果哈希是不同的,我正在检查它是否不止一次。 但正如我所说,散列计算成本很高。 这里的订单也很重要。谢谢
答案 0 :(得分:5)
首先,is
不是您的应用程序的逻辑正确语法;请改用==
。请参阅此帖子以了解有关差异的更多信息:Is there a difference between `==` and `is` in Python?
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
答案 1 :(得分:2)
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
答案 2 :(得分:0)
是的, 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})
随着列表大小变大,各种方法的差异将变得更加明显。