簡體   English   中英

如何對包含數字和字母的字符串進行排序?

[英]How to sort strings containing numbers and letters?

我有以下形式的清單:

['AK 40', 'AK 35', 'AK 20', '2012',
'2011', '2010', '2009', '2009',
'2007', '2006', '2006', '2005',
'2004', '2003', '2003', '2002']

這些年份都代表出生年份和年齡組。 我需要按以下形式對其進行排序:

['2012', '2011', '2010', ... , '2003', '2002', 'AK 20', 'AK 35', 'AK 40']

基本上,年齡應該從最小的年齡到最大的年齡遞減。 但是從20歲開始,他們需要得到不同的對待。

我已經嘗試了一些在stackoverflow上找到的lambda函數,但是不幸的是,由於我的列表僅包含字符串,並且沒有與整數混合,因此它們對我都不起作用。

如果您的字符串共享相同的前綴(在本例中為AK ),則可以使用以下lambda函數:

sort_func = lambda e : -int(e) if e.isdigit() else int(''.join(filter(str.isdigit, e)))

sorted_list = sorted(l, key = sort_func)

其中l是您的初始列表,例如,輸出:

['2012', '2011', '2010', '2009', '2009', '2007', '2006', '2006', '2005', '2004', '2003', '2003', '2002', 'AK 20', 'AK35', 'AK 40']

上述功能第一排序在今年字符串(的--len(e)是用於他們降序排序),那么,它由前綴后的數字按升序排序年齡組AK (通過過濾掉任何東西這不是年齡段字符串中的數字)。

seq = ['AK 40', 'AK 35', 'AK 20', '2012', '2011', '2010', '2009', '2009',
       '2007', '2006', '2006', '2005', '2004', '2003', '2003', '2002']

years = [year for year in seq if year.isdigit()]
aks = [ak for ak in seq if not ak.isdigit()]
years.sort()
aks.sort()
result = years[::-1] + aks
print(result)
x = ['AK 40', 'AK 35', 'AK 20', '2012', '2011', '2010', '2009', '2009', '2007', '2006', '2006', '2005', '2004', '2003', '2003', '2002']

簡短將是

sorted_list = sorted(x, key = lambda e : int(e.replace('AK ', '-')), reverse=True)

您可以使用一個簡單的排序鍵:

d = ['AK 40', 'AK 35', 'AK 20', '2012', '2011', '2010', '2009', '2009', '2007', '2006', '2006', '2005', '2004', '2003', '2003', '2002']
new_d = sorted(d, key=lambda x:[1, -1][x.isdigit()]*int(x.split()[-1]))

輸出:

['2012', '2011', '2010', '2009', '2009', '2007', '2006', '2006', '2005', '2004', '2003', '2003', '2002', 'AK 20', 'AK 35', 'AK 40']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM