【问题标题】:python: Difference between operation sorted(set(array)) vs set(sorted(array))python:操作排序(集合(数组))与集合(排序(数组))之间的区别
【发布时间】:2020-06-03 23:04:20
【问题描述】:

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

以下两段代码生成的列表应该相同。

#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

【问题讨论】:

  • @juanpa.arrivillaga 我给出了最小可重复的例子。请阅读问题中提供的示例
  • @juanpa.arrivillaga 我已经更新了问题,感谢您的指导!

标签: python python-3.x sorting set


【解决方案1】:

不,从逻辑上讲,它不应该为真。

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]

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

【讨论】:

  • 有道理,我尝试使用值 [10000, 100000, 10000000, 100000000000] 并没有返回 True
  • @Anuj 是的。真的,令人惊讶的事情是,这确实会返回 True!同样,可能只会发生在像 int 对象这样的事情上,其中对象的顺序在某种程度上被散列函数保留。其他任何时候都只是运气好
猜你喜欢
  • 1970-01-01
  • 2012-08-27
  • 1970-01-01
  • 2017-05-28
  • 1970-01-01
  • 2010-11-08
  • 2020-09-15
  • 2021-08-04
  • 2010-12-03
相关资源
最近更新 更多