使用Python按多个条件对列表进行排序

4

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

0.0.0.0.py
1.0.0.0.py
1.1.0.0.py

它们都存储在一个列表中。我的想法是使用列表的 sort 方法和 lambda 表达式。Lambda 表达式应该首先删除 .py 扩展名,然后通过点分割字符串。将每个数字转换为整数并按它们进行排序。
我知道如何在 C# 中完成此操作,但不知道如何使用 Python 完成此操作。一个问题是,如何按多个条件排序?如何嵌入执行此操作的 Lambda 表达式?
有人能帮助我吗?
非常感谢!
3个回答

5
您可以使用sorted函数的关键字参数:
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使用此值作为排序标准。

似乎是最好的解决方案。非常感谢! - BendEg

3

请让您的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

谢谢,我会尝试的! - BendEg

2
# read list in from memory and store as variable file_list
sorted(file_list, key = lambda x: map(int, x.split('.')[:-1]))

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

我们的lambda函数首先将文件名拆分为由句点分隔的数组。然后我们取出列表中的所有元素,除了最后一个元素,即文件扩展名。然后我们对列表中的每个元素应用'int'函数。返回的列表根据列表元素排序,从第一个开始,并通过列表中后面的元素解决平局。


[:-1] 处理了所有文件扩展名,而不仅仅是 .py。使用 mapint 对拆分进行操作。对此加一。 - aneroid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接