【问题标题】:Sort list with multiple criteria in python在python中使用多个条件对列表进行排序
【发布时间】:2016-01-26 22:37:12
【问题描述】:

目前我正在尝试对由版本号组成的文件列表进行排序。例如:

0.0.0.0.py
1.0.0.0.py
1.1.0.0.py

它们都存储在一个列表中。我的想法是将列表的sort 方法与lambda 表达式结合使用。 lambda 表达式应首先删除 .py 扩展名,然后用点分割字符串。比将每个数字转换为整数并按它们排序。

我知道如何在 c# 中执行此操作,但我不知道如何使用 python 执行此操作。一个问题是,如何对多个标准进行排序?以及如何嵌入 lambda 表达式?

谁能帮帮我?

非常感谢!

【问题讨论】:

    标签: python list sorting lambda


    【解决方案1】:

    你可以使用sorted函数的key参数:

    filenames = [
        '1.0.0.0.py',
        '0.0.0.0.py',
        '1.1.0.0.py'
    ]
    
    print sorted(filenames, key=lambda f: map(int, f.split('.')[:-1]))
    

    结果:

    ['0.0.0.0.py', '1.0.0.0.py', '1.1.0.0.py']
    

    lambda 将文件名拆分为多个部分,删除最后一部分并将剩余部分转换为整数。然后sorted 使用这个值作为排序标准。

    【讨论】:

    • 似乎是最好的解决方案。非常感谢!
    【解决方案2】:

    让您的key 函数返回一个项目列表。在这种情况下,排序是按字典顺序排列的。

    l = [ '1.0.0.0.py', '0.0.0.0.py', '1.1.0.0.py',]
    s = sorted(l, key = lambda x: [int(y) for y in x.replace('.py','').split('.')])
    print s
    

    【讨论】:

    • 谢谢我试试这个!
    【解决方案3】:
    # read list in from memory and store as variable file_list
    sorted(file_list, key = lambda x: map(int, x.split('.')[:-1]))
    

    如果你想知道这里发生了什么:

    我们的 lambda 函数首先获取我们的文件名,将其拆分为一个由句点分隔的数组。然后我们取出列表中的所有元素,减去最后一个元素,即我们的文件扩展名。然后我们将“int”函数应用于列表的每个元素。返回的列表然后由 'sorted' 函数根据列表中的元素进行排序,从第一个开始,列表中后面的元素打破平局。

    【讨论】:

    • [:-1] 负责所有文件扩展名,而不仅仅是.py。并在拆分时使用mapint。为那些 +1。
    猜你喜欢
    • 2017-09-09
    • 2019-12-29
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2017-02-27
    • 2013-03-31
    • 1970-01-01
    • 2011-08-25
    相关资源
    最近更新 更多