在(key = lambda)排序中跳过前两个字符

时间:2015-02-11 23:08:47

标签: python sorting python-3.x dictionary lambda

这是我之前提出的问题的延伸,在此处可以看到: Sorting dictionary keys by value, then those with the same value alphabetically

我在字典中设置了用户和分数,因此密钥是" group.name"价值就是他们的得分(例如"' 3.Julie'' 7'是' 7' Julie"在第3组,得分为7 )。我已经知道如何按值排序,然后按键:

sorted(dictionary.items(), key=lambda t: t[::-1])

但是当它比较两个键时,我希望它忽略第一个字符/两个字符,以便具有相同分数的用户将按字母顺序排序(而目前,它们按组排序,作为组数字来自第一)。在不改变命名惯例的情况下,无论如何我能实现这一点吗? (理想情况下,在lambda键中,几行是正常的,但如果超过2-3,则不值得)

1 个答案:

答案 0 :(得分:3)

当您遍历dict.items()时,会得到元组(key, value),例如

>>> for t in {'3.Julie': '7'}.items():
       print t
('3.Julie', '7')

目前,你只是扭转了整个事情:

>>> ('3.Julie', '7')[::-1]
('7', '3.Julie')

但你可以更清楚地了解你想要的东西(即第二部分,然后是第一部分),并包括切片以删除相关字符:

>>> t = ('3.Julie', '7')
>>> t[1], t[0][2:]
('7', 'Julie')

因此您的排序变为:

sorted(dictionary.items(), key=lambda t: (t[1], t[0][2:]))

请注意,lambda中的括号是表示元组的必要条件,否则t[0][2:]将被解释为sorted的位置参数。


如果您希望值和键按相反方向排序,您可以执行以下操作:

key=lambda t: (-int(t[1]), t[0][2:])

例如:

>>> d = {'1.John': '3', '2.Karl': '7', '3.Julie': '7'}
>>> sorted(d.items(), key=lambda t: (-int(t[1]), t[0][2:]))
[('3.Julie', '7'), ('2.Karl', '7'), ('1.John', '3')]