Python 集合推导式中的字符串是怎样排序的?有谁知道?

简介: Python 集合推导式中的字符串是怎样排序的?有谁知道?

列表推导式都是按for循环的顺序来排列的,可是集合推导式中除了纯数字的集合外,有字符串的集合都是乱序的,到底是按什么规律排的?有谁知道什么原理?

Python 3.8.8 (tags/v3.8.8:024d805, Feb 19 2021, 13:08:11) [MSC v.1928 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license()" for more information.
>>> [chr(i+48) for i in range(10)]
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
>>> ["%dA"%i for i in range(10)]
['0A', '1A', '2A', '3A', '4A', '5A', '6A', '7A', '8A', '9A']
>>> ["A%d"%i for i in range(10)]
['A0', 'A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'A7', 'A8', 'A9']
>>> {i for i in range(10)}
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
>>> {"A%d"%i for i in range(10)}
{'A0', 'A5', 'A3', 'A1', 'A4', 'A6', 'A2', 'A9', 'A7', 'A8'}
>>> {"A%d"%i for i in range(10)}
{'A0', 'A5', 'A3', 'A1', 'A4', 'A6', 'A2', 'A9', 'A7', 'A8'}
>>> {"%dA"%i for i in range(10)}
{'8A', '9A', '4A', '1A', '7A', '6A', '2A', '0A', '3A', '5A'}
>>> {"%dA"%i for i in range(10)}
{'8A', '9A', '4A', '1A', '7A', '6A', '2A', '0A', '3A', '5A'}
>>> {i for i in range(10)}
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
>>> {"%dA"%i for i in range(10)}|{i for i in range(10)}
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, '6A', '2A', '3A', '5A', '8A', '1A', '7A', '0A', '4A', '9A'}
>>> {i for i in range(10)}|{"%dA"%i for i in range(10)}
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, '6A', '2A', '3A', '5A', '8A', '1A', '7A', '0A', '4A', '9A'}
>>> {i for i in range(10)}|{"A%d"%i for i in range(10)}
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'A0', 'A5', 'A1', 'A4', 'A3', 'A6', 'A2', 'A9', 'A7', 'A8'}
>>> {chr(i+48) for i in range(10)}
{'3', '4', '9', '2', '8', '5', '6', '7', '0', '1'}
>>> {chr(i+48) for i in range(10)}
{'3', '4', '9', '2', '8', '5', '6', '7', '0', '1'}
>>>



纯数字的,即使是随机生成的集合也会以升序排列:

>>> from random import randint as rnd
>>> {rnd(0,20) for i in range(20)}
{0, 1, 2, 3, 4, 5, 6, 8, 11, 12, 16, 19}
>>> {rnd(0,20) for i in range(20)}
{0, 2, 4, 5, 6, 8, 12, 13, 14, 15, 18}
>>> {rnd(0,20) for i in range(20)}
{0, 3, 6, 7, 8, 9, 10, 12, 13, 14, 18, 20}
>>> 


列表强制转换到集合,也是乱序的,顺序还与推导式直接生成的不一致。又是为什么?

>>> ["A%d"%i for i in range(10)]
['A0', 'A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'A7', 'A8', 'A9']
>>> set(["A%d"%i for i in range(10)])
{'A0', 'A5', 'A3', 'A1', 'A4', 'A6', 'A2', 'A9', 'A7', 'A8'}
>>> {"%dA"%i for i in range(10)}
{'8A', '9A', '4A', '1A', '7A', '6A', '2A', '0A', '3A', '5A'}
>>> sorted({"%dA"%i for i in range(10)})
['0A', '1A', '2A', '3A', '4A', '5A', '6A', '7A', '8A', '9A']
>>> set(sorted({"%dA"%i for i in range(10)}))
{'8A', '9A', '4A', '1A', '7A', '6A', '2A', '0A', '3A', '5A'}
>>> 



同样的方法,在字典推导式中也升序排列的。

>>> {i for i in range(10)}
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
>>> {"A%d"%i for i in range(10)}
{'A8', 'A4', 'A2', 'A3', 'A9', 'A0', 'A5', 'A6', 'A1', 'A7'}
>>> type({"A%d"%i for i in range(10)})
<class 'set'>
>>>
>>> {"A%d"%i:i for i in range(10)}
{'A0': 0, 'A1': 1, 'A2': 2, 'A3': 3, 'A4': 4, 'A5': 5, 'A6': 6, 'A7': 7, 'A8': 8, 'A9': 9}
>>> type({"A%d"%i:i for i in range(10)})
<class 'dict'>
>>>
>>> {i:"A%d"%i for i in range(10)}
{0: 'A0', 1: 'A1', 2: 'A2', 3: 'A3', 4: 'A4', 5: 'A5', 6: 'A6', 7: 'A7', 8: 'A8', 9: 'A9'}
>>> 
目录
相关文章
|
2月前
|
Java 数据处理 索引
(Pandas)Python做数据处理必选框架之一!(二):附带案例分析;刨析DataFrame结构和其属性;学会访问具体元素;判断元素是否存在;元素求和、求标准值、方差、去重、删除、排序...
DataFrame结构 每一列都属于Series类型,不同列之间数据类型可以不一样,但同一列的值类型必须一致。 DataFrame拥有一个总的 idx记录列,该列记录了每一行的索引 在DataFrame中,若列之间的元素个数不匹配,且使用Series填充时,在DataFrame里空值会显示为NaN;当列之间元素个数不匹配,并且不使用Series填充,会报错。在指定了index 属性显示情况下,会按照index的位置进行排序,默认是 [0,1,2,3,...] 从0索引开始正序排序行。
294 0
|
2月前
|
开发者 Python
Python列表推导式:优雅与效率的完美融合
Python列表推导式:优雅与效率的完美融合
337 104
|
2月前
|
Python
Python列表推导式:优雅与效率的艺术
Python列表推导式:优雅与效率的艺术
299 99
|
2月前
|
数据处理 Python
解锁Python列表推导式:优雅与效率的完美融合
解锁Python列表推导式:优雅与效率的完美融合
279 99
|
2月前
|
开发者 Python
Python列表推导式:一行代码的艺术与力量
Python列表推导式:一行代码的艺术与力量
435 95
|
3月前
|
开发者 Python
Python神技:用列表推导式让你的代码更优雅
Python神技:用列表推导式让你的代码更优雅
478 99
|
3月前
|
Python
Python中的f-string:更优雅的字符串格式化
Python中的f-string:更优雅的字符串格式化
354 100
|
3月前
|
程序员 Python
Python列表推导式:简洁与高效的艺术
Python列表推导式:简洁与高效的艺术
303 99
|
3月前
|
开发者 Python
Python中的f-string:高效字符串格式化的利器
Python中的f-string:高效字符串格式化的利器
479 99
|
3月前
|
Python
Python中的f-string:更优雅的字符串格式化
Python中的f-string:更优雅的字符串格式化

推荐镜像

更多