【问题标题】:Iteration in set, dont understand the way of this iteration [duplicate]集合中的迭代,不明白这个迭代的方式[重复]
【发布时间】:2013-07-21 15:39:39
【问题描述】:

我是最新的 Python。

我不明白为什么代码 {9, 4} 第一个数字是 9 而不是 4? 从第一组开始迭代?

{x*y for x in {1,2,3} for y in {2,3,4} if x == y}
{9, 4}

【问题讨论】:

  • 虽然集合是可迭代的,但它们具有类似于dicts 的任意顺序 - 因为两者都基于散列值...如果您需要有序集合,那么 Python 文档中链接了一个配方:code.activestate.com/recipes/576694

标签: python


【解决方案1】:

结果是一个集合,因此排序无关紧要。如果您使用列表运行相同的操作(将 {} 替换为 []),那么您将得到 [4, 9]。

【讨论】:

    【解决方案2】:

    集合是无序的。集合中元素的顺序由哈希函数定义,而不是插入顺序。

    【讨论】:

    • 不仅取决于哈希函数,还取决于底层表的大小、容器上过去插入和删除的序列、实现细节(例如探测序列),以及在某些版本中(有时,只有在给定某个命令行标志的情况下)哈希随机化在同一程序的相同调用之间可能会有所不同。
    • 在这种特殊情况下,没有删除。但是,是的,“由实现细节”定义将是更准确(如果说明性较少)的描述。事实上,根本没有要求将集合实现为哈希表。
    • 我确实认为要求它们是哈希表,或者至少它们使用__hash____eq__,而不是任何其他操作(例如比较)。否则,集合中使用的一半类型(以及 dicts,就此而言)将停止在替代实现中使用集合。
    • 需要使用__hash____eq__ 并不排除将集合实现为例如未排序的数组。或平衡二叉树。或 $OTHER_DATA_STRUCTURE。
    猜你喜欢
    • 2012-07-03
    • 1970-01-01
    • 2016-02-19
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    相关资源
    最近更新 更多