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

Skip first two characters in (key=lambda) sorting

这是对我之前的问题的扩展,该问题得到了适当的回答,见此处:

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

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

但是当它比较两个键时,我希望它忽略前 character/two 个字符,这样得分相同的用户将按字母顺序排序(而目前,他们将按组排序,因为组号在前)。在不改变命名约定的情况下,我能做到这一点吗? (理想情况下,在 lambda 键内,几行就可以了,但如果超过 2-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')]