如何对包含数字和字母的字符串进行排序?

时间:2019-08-31 22:09:37

标签: python python-3.x sorting

我有以下形式的列表:

['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岁开始,就需要对它们进行区别对待。

我已经尝试了一些lambda函数,这些函数是在stackoverflow上找到的,但是不幸的是,由于我的列表仅包含字符串,并且没有与整数混合,因此它们对我都不起作用。

4 个答案:

答案 0 :(得分:0)

如果字符串共享相同的前缀(在这种情况下为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(通过过滤年龄组字符串中不是数字的任何内容)。

答案 1 :(得分:0)

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)

答案 2 :(得分:0)

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)

答案 3 :(得分:0)

您可以使用简单的排序键:

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']