【问题标题】:Skip first two characters in (key=lambda) sorting在 (key=lambda) 排序中跳过前两个字符
【发布时间】:2015-04-12 12:45:27
【问题描述】:

这是对我之前的问题的扩展,得到了适当的回答,请参见此处: Sorting dictionary keys by value, then those with the same value alphabetically

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

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

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

【问题讨论】:

  • key=lambda t: (t[1], t[0][2:])?
  • @jonrsharpe 当我尝试这样做时,我得到一个“关键字 arg 之后的非关键字 arg”SyntaxError。
  • 我看不出你有什么理由得到那个,除非你不小心把之前的key丢了。
  • @jonrsharpe 从头开始​​,我省略了括号。它似乎工作正常,但是我使用 reverse=True,所以字母顺序是倒着的。有什么办法可以解决吗?
  • ...不要使用reverse=True?

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


【解决方案1】:

当你迭代 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')]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 2010-12-15
    • 2020-04-13
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    相关资源
    最近更新 更多