如何在 python 中对字母数字集进行排序
- 2025-03-05 09:17:00
- admin 原创
- 2
问题描述:
我有一套
set(['booklet', '4 sheets', '48 sheets', '12 sheets'])
排序后我希望它看起来像
4 sheets,
12 sheets,
48 sheets,
booklet
有任何想法吗
解决方案 1:
Jeff Atwood讨论了自然排序,并给出了在 Python 中执行自然排序的一个例子。下面是我对此的改进:
import re
def sorted_nicely( l ):
""" Sort the given iterable in the way that humans expect."""
convert = lambda text: int(text) if text.isdigit() else text
alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ]
return sorted(l, key = alphanum_key)
使用方式如下:
s = set(['booklet', '4 sheets', '48 sheets', '12 sheets'])
for x in sorted_nicely(s):
print(x)
输出:
4 sheets
12 sheets
48 sheets
booklet
此方法的一个优点是它不仅适用于字符串由空格分隔的情况,还适用于其他分隔符,例如版本号中的句点(例如 1.9.1 在 1.10.0 之前)。
解决方案 2:
简短而甜蜜:
sorted(data, key=lambda item: (int(item.partition(' ')[0])
if item[0].isdigit() else float('inf'), item))
此版本:
适用于 Python 2 和 Python 3,因为:
+ 它不假设您比较字符串和整数(这在 Python 3 中不起作用)
+ 它不使用`cmp`参数 to `sorted`(Python 3 中不存在该参数)
如果数量相等,将按字符串部分排序
如果您希望打印输出与示例中的描述完全一致,那么:
data = set(['booklet', '4 sheets', '48 sheets', '12 sheets'])
r = sorted(data, key=lambda item: (int(item.partition(' ')[0])
if item[0].isdigit() else float('inf'), item))
print ',
'.join(r)
解决方案 3:
您应该查看第三方库natsort。它的算法是通用的,因此它适用于大多数输入。
>>> import natsort
>>> your_list = set(['booklet', '4 sheets', '48 sheets', '12 sheets'])
>>> print ',
'.join(natsort.natsorted(your_list))
4 sheets,
12 sheets,
48 sheets,
booklet
解决方案 4:
一种简单的方法是将字符串分成数字部分和非数字部分,然后使用 python 元组排序顺序对字符串进行排序。
import re
tokenize = re.compile(r'(d+)|(D+)').findall
def natural_sortkey(string):
return tuple(int(num) if num else alpha for num, alpha in tokenize(string))
sorted(my_set, key=natural_sortkey)
解决方案 5:
有人建议我在这里重新发布这个答案,因为它也适用于这种情况
from itertools import groupby
def keyfunc(s):
return [int(''.join(g)) if k else ''.join(g) for k, g in groupby(s, str.isdigit)]
sorted(my_list, key=keyfunc)
演示:
>>> my_set = {'booklet', '4 sheets', '48 sheets', '12 sheets'}
>>> sorted(my_set, key=keyfunc)
['4 sheets', '12 sheets', '48 sheets', 'booklet']
对于 Python3 来说需要稍微修改一下(这个版本在 Python2 中也可以正常工作)
def keyfunc(s):
return [int(''.join(g)) if k else ''.join(g) for k, g in groupby(' '+s, str.isdigit)]
解决方案 6:
对字符串数组中任意位置的任意数字进行排序的通用答案。适用于 Python 2 和 3。
def alphaNumOrder(string):
""" Returns all numbers on 5 digits to let sort the string with numeric order.
Ex: alphaNumOrder("a6b12.125") ==> "a00006b00012.00125"
"""
return ''.join([format(int(x), '05d') if x.isdigit()
else x for x in re.split(r'(d+)', string)])
样本:
s = ['a10b20','a10b1','a3','b1b1','a06b03','a6b2','a6b2c10','a6b2c5']
s.sort(key=alphaNumOrder)
s ===> ['a3', 'a6b2', 'a6b2c5', 'a6b2c10', 'a06b03', 'a10b1', 'a10b20', 'b1b1']
部分答案就在这里
解决方案 7:
>>> a = set(['booklet', '4 sheets', '48 sheets', '12 sheets'])
>>> def ke(s):
i, sp, _ = s.partition(' ')
if i.isnumeric():
return int(i)
return float('inf')
>>> sorted(a, key=ke)
['4 sheets', '12 sheets', '48 sheets', 'booklet']
解决方案 8:
根据 SilentGhost 的回答:
In [4]: a = set(['booklet', '4 sheets', '48 sheets', '12 sheets'])
In [5]: def f(x):
...: num = x.split(None, 1)[0]
...: if num.isdigit():
...: return int(num)
...: return x
...:
In [6]: sorted(a, key=f)
Out[6]: ['4 sheets', '12 sheets', '48 sheets', 'booklet']
解决方案 9:
集合本质上是无序的。您需要创建一个具有相同内容的列表并对其进行排序。
解决方案 10:
b = set(['booklet', '10-b40', 'z94 boots', '4 sheets', '48 sheets',
'12 sheets', '1 thing', '4a sheets', '4b sheets', '2temptations'])
numList = sorted([x for x in b if x.split(' ')[0].isdigit()],
key=lambda x: int(x.split(' ')[0]))
alphaList = sorted([x for x in b if not x.split(' ')[0].isdigit()])
sortedList = numList + alphaList
print(sortedList)
Out: ['1 thing',
'4 sheets',
'12 sheets',
'48 sheets',
'10-b40',
'2temptations',
'4a sheets',
'4b sheets',
'booklet',
'z94 boots']
解决方案 11:
对于使用 Python 2.4 之前版本且没有这个出色sorted()
函数的人来说,一种对集合进行排序的快速方法是:
l = list(yourSet)
l.sort()
这并没有回答上面的具体问题(12 sheets
将会在之前出现4 sheets
),但对于来自 Google 的人来说可能会有用。
相关推荐
热门文章
项目管理软件有哪些?
- 2025年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
热门标签
云禅道AD