【问题标题】:Why does Python print a set of numbers as ordered为什么Python按顺序打印一组数字
【发布时间】:2020-06-13 14:02:31
【问题描述】:

我尝试在 python idle {6,3,7} 中打印这个。输出为 {3,6,7}。集合不应该是无序的并且每次都打印不同的顺序吗?是否与构建哈希映射的方式有关?

【问题讨论】:

  • 不能依赖任何特定的顺序并不意味着python每次必须以不同的顺序打印它们。对于{6,3,8},它正在为我报告set([8, 3, 6]),因此通常情况下它们肯定不会按顺序返回。关于“每次”,我怀疑如果您反复迭代同一个集合而不修改它,那么即使不是任何特定的顺序,顺序也会确定性相同,尽管其他人必须确认这一点。

标签: python


【解决方案1】:

集合在 Python 中确实是无序的。您的特定示例集恰好在迭代时以明显排序的顺序给出元素(并且在 python 2.7.6 和 3.4.3 中似乎可重现)这一事实并不能否定这一事实,另一个示例以既不是它们添加到集合中的顺序,也没有排序。

>>> list(set([6,3,7]))
[3, 6, 7]

>>> list(set([6,3,8]))
[8, 3, 6]

对于值 6、3 和 8,在包含这些值的 python 集合上的迭代将产生元素的顺序至少看起来是一致的,无论填充集合的顺序如何。然而,这并没有说明这个结果是否普遍正确,无论如何它应该被视为一个实现细节。用户代码根本不应该假设任何顺序。

>>> from sympy.utilities.iterables import multiset_permutations
>>> for p in multiset_permutations([3,6,8]): print(p, list(set(p)))
... 
([3, 6, 8], [8, 3, 6])
([3, 8, 6], [8, 3, 6])
([6, 3, 8], [8, 3, 6])
([6, 8, 3], [8, 3, 6])
([8, 3, 6], [8, 3, 6])
([8, 6, 3], [8, 3, 6])

【讨论】:

    【解决方案2】:

    你看,我理解你的担心,当我第一次看到它时,我一开始也很困惑。但我敢肯定,你知道集合是无序和无索引的。因此,任何集合的元素都不可能是有序的。尝试运行 a = {6,2,90,4,12,0,4000,345} 或您的示例之类的东西——在 Jupyter Notebook、IDLE 或通过命令提示符。它的排列方式不同。

    在 Jupyter 上,它给出了: {0, 2, 4, 6, 12, 90, 345, 4000}

    在命令提示符下: {0, 4000, 2, 4, 6, 12, 345, 90}

    并且当你一个一个地打印一个集合的元素时,它会按顺序显示:

    4000
    2
    4
    6
    12
    345
    90
    

    我相信您正在尝试使用 Jupyter。当您想在此处查看 a 之类的变量时,它们似乎总是对其进行排序。

    对于您的疑问,哈希映射概念适用于字典,而不适用于集合。

    【讨论】:

    • 谢谢。但我是在空闲时做的。我还在 geeksforgeeks 上阅读了在底层代码中设置使用哈希映射的内容?你知道它使用什么数据结构吗?
    • @MilanMuhammed 数据结构(哈希图)是一个实现细节,你不能指望它不会改变。字典的实现在 3.6 中发生了变化,因此它们保留了插入顺序,但集合仍然是无序的。
    猜你喜欢
    • 2017-09-15
    • 2018-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多