python:操作排序(set(array))与set(sorted(array))之间的区别



当我遇到一个奇怪的行为时,我正在解决一个关于黑客等级的问题。

从以下 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]

但这是一个实现细节...

最新更新