【笔记】集合输出有序 | Python中的集合使用print函数输出时有时候会自动排序的问题

众所周知,在Python中,集合(set)与数学中集合的概念类似,用于保存不重复的元素。它有可变集合和不可变集合(frozenset)两种。其中,可变集合是无序的,每次输出的元素排列顺序有可能不同。
然而,在某日Python练习中,偶然发现某整数集合在使用print函数输出时是有序的:

set1 = {'水瓶座', '双子座', '巨蟹座', '金牛座'}
set2 = {3, 1, 4, 1, 5, 9, 2, 6}
set3 = {'python', 28, ('人生苦短', '及时行乐')}
print(set1)
print(set2)
print(set3)

其输出结果如下:

{'水瓶座', '金牛座', '双子座', '巨蟹座'}
{1, 2, 3, 4, 5, 6, 9}
{('人生苦短', '及时行乐'), 'python', 28}

反复尝试几十次,发现整数集合set2的每次输出都是有序的,而其他片段顺序不同:

{'水瓶座', '金牛座', '巨蟹座', '双子座'}
{1, 2, 3, 4, 5, 6, 9}
{28, ('人生苦短', '及时行乐'), 'python'}

经查阅,在本站博主【Ice-冰鸽】处找到答案:
链接: link

这是因为python3版本在输出值较小的集合时会自动从小到大输出,而遇到大值的时候就不会了。

经测试确实如此:

set4 = {45254, 35, 621, 7, 2, 8, 4, 4523, 2346, 99}
set5 = {'python', 'java', 'C#', 'C', 28, 7, 3, 72, 135, 7, 35, ('人生苦短', '及时行乐')}
print(set4)
print(set5)

输出结果为:

{2, 99, 35, 4, 45254, 7, 8, 2346, 4523, 621}
{'C', 3, 35, 'python', 7, 72, 'C#', 135, 'java', 28, ('人生苦短', '及时行乐')}

但此时又产生了新的问题:同样输出几十次后,全为整数的集合set4确实不再有序了,但每次的顺序依旧是一样的,还是{2, 99, 35, 4, 45254, 7, 8, 2346, 4523, 621}。此外,如果使用以下代码:

set4 = {45254, 35, 621, 7, 2, 8, 4, 4523, 2346, 99}
set5 = {'python', 'java', 'C#', 'C', 28, 7, 3, 72, 135, 7, 35, ('人生苦短', '及时行乐')}

for i in range(10):
    print(set4)
    print(set5)

那么输出结果中set5也将固定顺序:

{2, 99, 35, 4, 45254, 7, 8, 2346, 4523, 621}
{3, 35, 'C#', 7, 72, 135, ('人生苦短', '及时行乐'), 'C', 28, 'python', 'java'}
{2, 99, 35, 4, 45254, 7, 8, 2346, 4523, 621}
{3, 35, 'C#', 7, 72, 135, ('人生苦短', '及时行乐'), 'C', 28, 'python', 'java'}
{2, 99, 35, 4, 45254, 7, 8, 2346, 4523, 621}
{3, 35, 'C#', 7, 72, 135, ('人生苦短', '及时行乐'), 'C', 28, 'python', 'java'}
{2, 99, 35, 4, 45254, 7, 8, 2346, 4523, 621}
{3, 35, 'C#', 7, 72, 135, ('人生苦短', '及时行乐'), 'C', 28, 'python', 'java'}
{2, 99, 35, 4, 45254, 7, 8, 2346, 4523, 621}
{3, 35, 'C#', 7, 72, 135, ('人生苦短', '及时行乐'), 'C', 28, 'python', 'java'}
{2, 99, 35, 4, 45254, 7, 8, 2346, 4523, 621}
{3, 35, 'C#', 7, 72, 135, ('人生苦短', '及时行乐'), 'C', 28, 'python', 'java'}
{2, 99, 35, 4, 45254, 7, 8, 2346, 4523, 621}
{3, 35, 'C#', 7, 72, 135, ('人生苦短', '及时行乐'), 'C', 28, 'python', 'java'}
{2, 99, 35, 4, 45254, 7, 8, 2346, 4523, 621}
{3, 35, 'C#', 7, 72, 135, ('人生苦短', '及时行乐'), 'C', 28, 'python', 'java'}
{2, 99, 35, 4, 45254, 7, 8, 2346, 4523, 621}
{3, 35, 'C#', 7, 72, 135, ('人生苦短', '及时行乐'), 'C', 28, 'python', 'java'}
{2, 99, 35, 4, 45254, 7, 8, 2346, 4523, 621}
{3, 35, 'C#', 7, 72, 135, ('人生苦短', '及时行乐'), 'C', 28, 'python', 'java'}

挖个坑,以后再填。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值