3 回答

TA貢獻(xiàn)2039條經(jīng)驗(yàn) 獲得超8個(gè)贊
簡(jiǎn)短而甜美:
sorted(data, key=lambda item: (int(item.partition(' ')[0])
if item[0].isdigit() else float('inf'), item))
這個(gè)版本:
適用于Python 2和Python 3,因?yàn)椋?/p>
它不假定您比較字符串和整數(shù)(在Python 3中不起作用)
它不使用cmp參數(shù)sorted(Python 3中不存在)
如果數(shù)量相等,將按字符串部分排序
如果要完全按照示例中的說明打印輸出,則:
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 ',\n'.join(r)

TA貢獻(xiàn)2016條經(jīng)驗(yàn) 獲得超9個(gè)贊
Jeff Atwood討論了自然排序,并舉例說明了使用Python進(jìn)行排序的一種方法。這是我的變化形式:
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
此方法的一個(gè)優(yōu)點(diǎn)是,當(dāng)字符串之間用空格分隔時(shí),該方法不僅有用。它也適用于其他分隔符,例如版本號(hào)中的句點(diǎn)(例如1.9.1在1.10.0之前)。

TA貢獻(xiàn)2036條經(jīng)驗(yàn) 獲得超8個(gè)贊
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']
對(duì)于Python3,有必要對(duì)其進(jìn)行一些修改(此版本在Python2中也可以正常使用)
def keyfunc(s):
? ? return [int(''.join(g)) if k else ''.join(g) for k, g in groupby('\0'+s, str.isdigit)]
添加回答
舉報(bào)