我有一个符合以下模式的文件名列表:s[num][alpha1][alpha2].ext
我需要排序,首先按数字,然后按 alpha1,然后按 alpha2。然而,最后两个不是按字母顺序排列的,而是应该反射(reflect)自定义顺序。
我创建了两个列表来表示 alpha1 和 alpha2 的顺序,如下所示:
alpha1Order = ["Fizz", "Buzz", "Ipsum", "Dolor", "Lorem"]
alpha2Order = ["Sit", "Amet", "Test"]
最好的方法是什么?我的第一个想法是(以某种方式)标记化,以便将每个文件名分成其组成部分(s、num、alpha1、alpha2),然后排序,但我不太确定如何执行如此复杂的排序。使用关键功能似乎很笨拙,因为这种类型似乎不适合简单的排序。
最佳答案
一旦标记化,您的数据就可以通过 key
函数完美订购。只需返回该值的 alpha1Order
和 alpha2Order
列表的索引即可。将它们替换为字典以使查找更容易:
alpha1Order = {token: i for i, token in enumerate(alpha1Order)}
alpha2Order = {token: i for i, token in enumerate(alpha2Order)}
def keyfunction(filename):
num, alpha1, alpha2 = tokenize(filename)
return int(num), alpha1Order[alpha1], alpha2Order[alpha2]
这将返回一个要排序的元组; Python 将使用第一个值进行排序,将具有相同 int(num)
值的任何内容按第二个条目排序,使用第三个值来打破与前两个条目相关的任何值。
关于python - Python 中的自定义排序复杂字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21119628/