我是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']
如何更改我的商品名称,以便能够首先按数字而不是字母对其进行排序?
答案 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']