为何f-string输出集合推导结果时64位置异常?列表推导却正常?
为什么集合推导式输出顺序和列表推导式不一致?
先看你用到的代码和对应的输出:
集合推导式代码:
print(f"{ {x ** 2 if (x**2) <= 10 else x ** 3 for x in range(5)} }")
输出结果:
{0, 1, 64, 4, 9}
列表推导式代码:
print([x ** 2 if (x ** 2) <= 10 else x ** 3 for x in range(5)])
输出结果:
[0, 1, 4, 9, 64]
两者输出顺序差异的核心原因,是Python中集合(set)和列表(list)的本质特性完全不同:
- 列表是有序容器,会严格按照元素的插入顺序保存数据,输出时也会遵循这个顺序。所以你的列表推导式会完全对应
range(5)的遍历顺序(0→1→2→3→4)生成结果,最终顺序和推导过程完全一致。 - 集合是无序容器,它的底层基于哈希表实现,元素的存储位置由自身的哈希值计算得出,不会保留任何插入顺序。因此集合推导式生成的元素,输出顺序只和哈希表的存储规则有关,和你推导时的遍历顺序没有关联,这就导致64出现在了非预期的位置。
注意:Python 3.7及以上版本中,普通字典会保留插入顺序,但集合依然是无序的,别把这两个容器的特性搞混。
内容的提问来源于stack exchange,提问作者Ruslan Efanov
相关产品推荐
相关产品推荐

