python:首先按数字顺序而不是按字母顺序对字符串列表进行重新排序

时间:2019-05-08 14:11:36

标签: python

我是python列表的初学者。我有一个按类型和发生年份命名的要素类列表:要素类“ a_05”发生在2005年,要素类“ b_03”发生在2003年。

我想按出现的时间(2003、2005 ...)对列表中的项目进行排序,如果同一年出现两种类型,则应该按字母顺序对其进行排序。

比方说,列表

fcs = [u'b_02', u'a_05', u'a_03', u'b_03']

应该在[ u'b_02', u'a_03', u'b_03', u'a_05']

结果

即前几年(_02,_03,_03,_05),然后按字母顺序u'a_03', u'b_03'

仅使用fcs.sort()而不是按数字先按字母顺序对我的商品进行排序:[u'a_03', u'a_05', u'b_02', u'b_03']

如何更改我的商品名称,以便能够首先按数字而不是字母对其进行排序?

3 个答案:

答案 0 :(得分:3)

使用sorted和自定义键。

例如:

fcs = [u'b_02', u'a_05', u'a_03', u'b_03']
print(sorted(fcs, key=lambda x: int(x.split("_")[1])))

sort

例如:

fcs = [u'b_02', u'a_05', u'a_03', u'b_03']
fcs.sort(key=lambda x: int(x.split("_")[1]))
print(fcs)

输出:

['b_02', 'a_03', 'b_03', 'a_05']

使用lambda函数将元素除以_,然后将其转换为int

答案 1 :(得分:1)

fcs = [u'b_02', u'a_05', u'a_03', u'b_03']
fcs.sort(key=lambda x:[int(x.split('_')[1]),x.split('_')[0]])

输出

['b_02', 'a_03', 'b_03', 'a_05']

使用lambda here

的完整文档

在这里,我正在下令排序,使用方法1对列表进行排序,如果方法1中的值很少,则使用方法2对这些相同的值进行排序(就像嵌套排序)。排序顺序在列表中定义。

方法1:x.split('_')[1]]#以整数为基础

方法2:x.split('_')[0]]#基于字母

PS。对不起,我不好解释。

答案 2 :(得分:0)

在进行简单比较的情况下,您可以将key参数与lambda函数一起使用,该函数定义要精确比较的内容(您可以在另一个答案中看到它)。但是有时您会缺少key参数。在这种情况下,您可以使用functools模块中的cmp_to_key函数。它允许您在函数内部进行复杂的比较,将其包装与此函数并作为sorted()参数发送给key函数。这是示例:

from functools import cmp_to_key

fcs = [u'b_02', u'a_05', u'a_03', u'b_03']

def waka(s1, s2):
    name1, year1 = s1.rsplit('_', 1)
    name2, year2 = s2.rsplit('_', 1)
    if year1 > year2:
        return 1
    elif year1 < year2:
        return -1
    elif name1 > name2:
        return 1
    elif name1 < name2:
        return -1
    else:
        return 0

sorted(fcs, key=cmp_to_key(waka))


['b_02', 'a_03', 'b_03', 'a_05']