python:自定义排序:不是纯粹的词典编排,而是反向和最短的通用优先

问题描述

背景

我想反向排序,但不严格按字典顺序排序,然后它变得更加奇怪。:P

原因是专有软件完全按照我在此描述的方式解析目录,并且希望复制该行为。

要求(按顺序)

  1. 两者:python2和python3兼容
  2. 反字典法
  3. 最短共同优先

示例数据

以下是该python脚本的(随机排序)输入数据的示例:

IA-test-PROD-me
ia-test-prod-me
ia-test-me-staging
ia-test-me
ia-test-STAGING-me
IA-test-me
IA-test-me-staging
ia-test-me-prod
IA-test-me-STAGING
IA-test-me-prod
IA-test-me-PROD
IA-test-STAGING-me

它的外观如何

我将其存储在列表中,并且需要对它进行排序,使其看起来像这样:

ia-test-me
ia-test-prod-me
ia-test-me-staging
ia-test-me-prod
ia-test-STAGING-me
IA-test-me
IA-test-me-staging
IA-test-me-prod
IA-test-me-STAGING
IA-test-me-PROD
IA-test-STAGING-me
IA-test-PROD-me

代码

据我了解,sort()sorted()是按字典顺序排序的稳定函数。但是由于我需要执行所有上述要求,所以我陷入了atm的困境。

def sortLexo(input_list):
    words = input_list.split()
    words.sort(reverse=True)
 
    for i in words:
        print(i)

问题是仅凭sort() + reverse=True还是不够的,因为它不满足上面的要求3(最短的优先):

           <-------------. should be placed here
ia-test-prod-me          |
ia-test-me-staging      /|\
ia-test-me-prod          |
ia-test-me    -------> wrong
ia-test-STAGING-me
           <--------------- should be placed here
IA-test-me-staging        |
IA-test-me-prod          /|\
IA-test-me-STAGING        |
IA-test-me-PROD           |
IA-test-me    --------> wrong
IA-test-STAGING-me
IA-test-PROD-me

我已经玩过groupby来按长度排序,但是我无处可寻(我的python kl没那么深)..:(

我想对于拥有良好python知识的人来说,这样做非常容易..任何帮助表示赞赏!

解决方法

根据说明尝试将其拼凑在一起。似乎您想在比较字符串的右侧填充您希望接收的最高字符(我使用字符0xFF,但是如果您使用Unicode而不是ASCII,则可能需要更大的数字)。

MAX_LENGTH = max(len(word) for word in words)
sorted(words,key=lambda word: word + "\xFF" * (MAX_LENGTH - len(word)),reverse=True)

这将产生以下结果。尽管它与您的问题有所不同,但我无法理解哪种规范会在问题中产生输出。

ia-test-prod-me
ia-test-me
ia-test-me-staging
ia-test-me-prod
ia-test-STAGING-me
IA-test-me
IA-test-me-staging
IA-test-me-prod
IA-test-me-STAGING
IA-test-me-PROD
IA-test-STAGING-me
IA-test-PROD-me

代码的作用是这样:键函数创建了用于比较的键。在这种情况下,我们将单词放在单词的右边,并用我们期望在字符串中找到的最高字符填充单词;这就是代码"\xFF" * (MAX_LENGTH - len(word))。在字符串上使用乘法运算符似乎很奇怪,但是它可以工作并创建一个长度乘以该字符串的字符串。在这种情况下,最大字符串长度与当前字符串长度之间的差。在正常的字母排序中(例如在字典中),较短的单词在排序顺序中排在首位。使用最高字符填充会使字符串匹配,直到较短字符串的末尾(例如ia-test-meia-test-me-staging)都将较短的字符串放在最后(在这种情况下,因为我们用{{反转了整个列表1}})。