1

背景

我想反向排序但不严格按字典顺序排序,然后它变得更加奇怪..: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 知识的人来说,这非常容易做到。任何帮助表示赞赏!

4

1 回答 1

0

试图根据描述拼凑起来。似乎您想用您希望接收的最高字符填充比较字符串的右侧(我使用字符 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

代码的作用是:key 函数创建了用于比较的键。在这种情况下,我们取单词并用我们期望在字符串中找到的最高字符填充它的右侧;那是代码"\xFF" * (MAX_LENGTH - len(word))。在字符串上使用乘法运算符可能看起来很奇怪,但它可以工作并创建一个与您相乘的长度的字符串;在这种情况下,最大字符串长度与当前字符串长度之间的差异。在正常的字母排序中(如在字典中),较短的单词在排序顺序中排在第一位。用最高字符填充使匹配到较短字符串末尾的字符串(例如 sayia-test-meia-test-me-staging)将较短的字符串放在最后(在这种情况下首先是因为我们用 反转整个列表reverse=True)。

于 2020-11-10T21:36:01.897 回答