【问题标题】:Custom Sort Complicated Strings in PythonPython中的自定义排序复杂字符串
【发布时间】:2014-02-02 20:55:11
【问题描述】:

我有一个符合模式的文件名列表:s[num][alpha1][alpha2].ext

我需要先按数字排序,然后按 alpha1,然后按 alpha2。但是,最后两个不是按字母顺序排列的,而是应该反映自定义排序。

我创建了两个代表 alpha1 和 alpha2 排序的列表,如下所示:

alpha1Order = ["Fizz", "Buzz", "Ipsum", "Dolor", "Lorem"]
alpha2Order = ["Sit", "Amet", "Test"]

最好的方法是什么?我的第一个想法是(以某种方式)标记化,以便我将每个文件名拆分为其组成部分(s、num、alpha1、alpha2),然后排序,但我不太确定如何执行如此复杂的排序。使用键函数似乎很笨重,因为这种排序似乎不适合简​​单的排序。

【问题讨论】:

  • 一旦标记化,您的数据就可以通过key 函数完美排序。
  • 您能否指出更多关于如何使用key 函数按多个属性排序的信息?我不知道如何先按一个,然后按第二个更深,然后按第三个更深。

标签: python regex string sorting tokenize


【解决方案1】:

一旦标记化,您的数据就可以通过key 函数完美排序。只需返回值的alpha1Orderalpha2Order 列表的索引。用字典替换它们以使查找更容易:

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) 值的任何内容按第二个条目排序,使用第三个值打破与前两个条目绑定的任何值。

【讨论】:

  • 谢谢你,Martijn。我几乎解决了这个问题,但在标记化方面遇到了更多问题。由于其复杂性,我已将其作为一个单独的问题发布,并希望在我解决之前解决这两个问题。 stackoverflow.com/questions/21120378/…
  • 那是一个单独的问题;这个答案与您解决标记化的方式无关。
猜你喜欢
  • 1970-01-01
  • 2021-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-22
  • 1970-01-01
  • 2016-12-25
  • 1970-01-01
相关资源
最近更新 更多