【问题标题】:Python - sets .pop() behaviourPython - 设置 .pop() 行为
【发布时间】:2012-08-17 12:03:41
【问题描述】:

这是我在 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])

【问题讨论】:

  • 即使想要了解此类行为背后的实现也不是一个好主意,因为绝对不能保证或期望它们在版本之间保持稳定或 实现之间;如果您在 CPython 上进行测试,您将不会在 IronPython 或 Jython 上获得相同的行为,并且无法保证下一个 CPython 也将具有相同的行为。

标签: python python-2.7


【解决方案1】:

根据字典中元素的插入和删除,存在“一致的”内部排序。见:http://docs.python.org/library/stdtypes.html#dict.items

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

【讨论】:

    【解决方案2】:

    为什么它是从 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 岁)

    【讨论】:

    • >>> 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 的输出有误。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 2018-11-30
    • 2011-08-18
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    相关资源
    最近更新 更多