Python-sets.pop()行为

Python-sets.pop()行为,python,python-2.7,Python,Python 2.7,这是我在Python集合中注意到的奇怪的事情。我读到集合中没有顺序,但它会从0到79,然后从79到127弹出较低的元素。它不再弹出较低的。只有在128进来之后,79才会弹出。为什么是这样 在Python中有没有其他方法可以使用有序数据结构? 为什么它从0到79是最低的,而不是从79到127 >>s = set() >>s.add(72) >> s.add(74) >> s.add(76) >> s.pop() 72 >> s

这是我在Python集合中注意到的奇怪的事情。我读到集合中没有顺序,但它会从0到79,然后从79到127弹出较低的元素。它不再弹出较低的。只有在128进来之后,79才会弹出。为什么是这样

在Python中有没有其他方法可以使用有序数据结构? 为什么它从0到79是最低的,而不是从79到127

>>s = set()
>>s.add(72)
>> s.add(74)
>> s.add(76)
>> s.pop()
72
>> s.add(79)
>> s.pop()
74
>> s.add(81)
>> s
set([81, 76, 79])
>> s.pop()
76
>> s.add(83)
>> s
set([81, 83, 79])
>> s.add(85)
>> s
set([81, 83, 85, 79])
>> s.pop()
81
>> s
set([83, 85, 79])
根据字典中元素的插入和删除,存在“一致”的内部顺序。见:

据我所知,集合使用相同的哈希实现,并且很可能具有相同的排序效果。

根据字典中元素的插入和移除,存在“一致”的内部排序。见:


据我所知,集合使用相同的散列实现,并且很可能具有相同的排序效果。

为什么从0到79,而不是从79到128,会出现最低值?
不,排序不是随机的,但完全是任意的。python集合中没有特定的顺序。考虑这一点:

>>> s.add(14)
>>> s.add(11)
>>> s.add(3)
>>> s.add(13)
>>> s.add(2)

>>> s.pop()
13
>>> s.pop()
14
>>> s.pop()
2
>>> s.pop()
3
>>> s.pop()
11

这与你的结论不符。(这次发生在14个人身上)

为什么从0到79,而不是从79到128,出现了最低值?
不,排序不是随机的,但完全是任意的。python集合中没有特定的顺序。考虑这一点:

>>> s.add(14)
>>> s.add(11)
>>> s.add(3)
>>> s.add(13)
>>> s.add(2)

>>> s.pop()
13
>>> s.pop()
14
>>> s.pop()
2
>>> s.pop()
3
>>> s.pop()
11
这与您的结论不符。(这一次发生在14个版本中)

可能的重复(或者,可能),甚至想知道这样的行为背后的实现都不是一个好主意,因为它们绝对不能保证或期望在版本之间或实现之间是稳定的;如果您在CPython上进行测试,那么在IronPython或Jython上就不会有相同的行为,而且也不能保证下一个CPython也会有相同的行为。可能是重复的(或者,可能是重复的),甚至想知道这样的行为背后的实现都不是一个好主意,因为它们绝对不能保证或期望在版本之间或实现之间保持稳定;如果您在CPython上进行测试,您将无法在IronPython或Jython上获得相同的行为,并且无法保证下一个CPython也将具有相同的行为。>>>>s=set()>>s.add(14)>>s.add(11)>>s.add(3)>>s.add(13)>>s.add(2)>>s.add(2)>>s.pop([3,11,13,14])>>s.pop()>但是我得到了这个作为输出。我对0到79的输出是错误的。谢谢你的帮助。>>>>s=set()>>>s.add(14)>>>s.add(11)>>s.add(3)>>>s.add(13)>>s.add(2)>>>s set([3,2,11,13,14])>>s.pop()3>>s.pop()2>>s.pop()11>>s.pop()13>>s.pop()14>>但是我得到了这个输出。我对0到79的输出是错误的。谢谢你的帮助。