【问题标题】:python sort list by substrpython按substr排序列表
【发布时间】:2021-06-18 02:31:41
【问题描述】:

我想按内容的 substr 对列表进行排序。 想象一下下面的列表,我希望它按“-”后面的数字排序:

>>> lst = ['ABC-789','DEF-123','GHI-456']
>>> sorted(lst,key=lambda x=lst.split('-') x[1])

这给了我:

    sorted(lst, key=lambda x=lst.split('-');x[1])
                ^
SyntaxError: expression cannot contain assignment, perhaps you meant "=="?

我怎样才能做到这一点?

【问题讨论】:

  • 最后总是3位数的代码吗?你也可以只切片:lambda s: int(s[-3:])
  • 顺便说一句,您的语法错误来自lambda x=。对于匿名函数,语法为lambda variable_s: expression,使用冒号:不是赋值运算符=

标签: python list sorting lambda


【解决方案1】:

这应该可行:

sorted(lst, key=lambda x: int(x.split('-')[1]))

输出:

['DEF-123', 'GHI-456', 'ABC-789']

【讨论】:

    【解决方案2】:

    考虑这个更正的版本:

    lst = ['ABC-789','DEF-123','GHI-456']
    lst = sorted(lst,key=lambda x: int(x.split('-')[1]))
    print(lst)  # ['DEF-123', 'GHI-456', 'ABC-789']
    

    这里有两个问题。首先,您的 lambda 语法已关闭,您需要 lambda x: <expr in x>。其次,由于您想按数字排序,因此在提取连字符右侧的字符串后,您还应该转换为整数。巧合的是,您现在可以摆脱这种情况,因为所有数字都是相同的文本宽度(3 位数字)。但是,如果数字的宽度不同,按文本排序可能不会给出数字排序。

    【讨论】:

    • Oof.. 我先发布了这个.. 但不用担心,请为详细解释点赞:)
    • @Justin 您发布的最初答案在技术上是错误的(现在您已经更正了),但我也给了您一个支持。
    【解决方案3】:
    lst = ['ABC-789','DEF-123','GHI-456']
    lst.sort(key=lambda x:x.split('-')[1])
    print(lst)
    

    更正了 lambda 和 split 语法。另外,我使用了 list.sort 方法而不是 sorted,以防需要对原始列表进行排序和更改。

    【讨论】:

    • "使用list.sort" ...为什么?也许OP不想修改原始列表。你应该解释为什么你认为有必要使用就地排序方法而不是从sorted返回一个新列表。
    • list.sort 以防原始列表需要修改。
    猜你喜欢
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多