当我遇到一个奇怪的行为时,我正在解决一个关于黑客等级的问题。
从以下 2 段代码生成的列表应该是相同的。
#array is list containing random elements
#method 1
array1 = list(set(sorted(array)))
#method 2
array2 = sorted(set(array))
#Hence following line of code should return True
array1 == array2
但是,根据列表的大小,答案会有所不同。 如果列表的大小很小,假设有 10 个元素,那么该行代码返回 True。但是,如果列表足够长,则该语句返回 False。
我想了解幕后发生的事情,因为从逻辑上讲,在这两种情况下,答案都应该是真的。
示例 1:
In [60]: array
Out[60]: [9, 8, 5, 0, 2, 6, 7, 5, 1, 3]
In [61]: sorted(set(array)) == list(set(sorted(array)))
Out[61]: True
示例 2:
In [103]: import requests
In [104]: link = "https://hr-testcases-us-east-1.s3.amazonaws.com/70945/input02.txt?AWSAccessKeyId=AKIAJ4WZFDFQTZRGO3QA&Expires=1591229125&Signature=ocC7OZJJVIxAI00bzLNu73T%2BZTk%3D&response-
...: content-type=text%2Fplain"
In [105]: ipstring = requests.get(link).content.decode("utf-8")
In [106]: a = list(map(int, ipstring.split("n")[2].split()))
In [107]: sorted(set(a)) == list(set(sorted(a)))
Out[107]: False
不,从逻辑上讲,它不应该是真的。
sorted(set(a)) == list(set(sorted(a)))
在右侧,你对列表进行排序,然后调用set
,这会失去顺序,然后从中创建一个列表,这给了你一些任意的顺序,而sorted(set(a))
将永远被排序......
对于小例子,恰好set
保留了顺序,这是因为较小的正整数只是散列到自己。
所以考虑一下:
>>> data = [9, 8, 5, 0, 2, 6, 7, 5, 1, 3]
>>> data.sort()
>>> data
[0, 1, 2, 3, 5, 5, 6, 7, 8, 9]
>>> list(map(hash, data))
[0, 1, 2, 3, 5, 5, 6, 7, 8, 9]
但这是一个实现细节...