python:自定义排序:不是纯粹的字典顺序而是反向和最短公共优先
python: custom sort: not purely lexicographical but reverse and shortest common first
背景
我想反向排序但不是严格的字典顺序然后它变得更奇怪.. :P
原因是专有软件完全按照我在此处描述的方式解析目录,我想复制该行为。
要求(按此顺序)
- 两者:python2 和 python3 兼容
- 反向字典序
- 最短公共优先
示例数据
以下是该 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
代码的作用是:key 函数创建了用于比较的键。在这种情况下,我们取这个词并用我们期望在字符串中找到的最高字符填充它的右侧;那就是代码 "\xFF" * (MAX_LENGTH - len(word))
。在字符串上使用乘法运算符可能看起来很奇怪,但它可以工作并创建一个字符串,其长度与您相乘;在这种情况下,最大字符串长度与当前字符串的长度之间的差异。在正常的字母排序中(如在字典中),较短的词在排序顺序中排在第一位。用最高字符填充使得字符串匹配到较短字符串的末尾(比如 ia-test-me
和 ia-test-me-staging
)将较短的字符串放在最后(在这种情况下,因为我们用 [= 反转整个列表) 15=]).
背景
我想反向排序但不是严格的字典顺序然后它变得更奇怪.. :P
原因是专有软件完全按照我在此处描述的方式解析目录,我想复制该行为。
要求(按此顺序)
- 两者:python2 和 python3 兼容
- 反向字典序
- 最短公共优先
示例数据
以下是该 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
代码的作用是:key 函数创建了用于比较的键。在这种情况下,我们取这个词并用我们期望在字符串中找到的最高字符填充它的右侧;那就是代码 "\xFF" * (MAX_LENGTH - len(word))
。在字符串上使用乘法运算符可能看起来很奇怪,但它可以工作并创建一个字符串,其长度与您相乘;在这种情况下,最大字符串长度与当前字符串的长度之间的差异。在正常的字母排序中(如在字典中),较短的词在排序顺序中排在第一位。用最高字符填充使得字符串匹配到较短字符串的末尾(比如 ia-test-me
和 ia-test-me-staging
)将较短的字符串放在最后(在这种情况下,因为我们用 [= 反转整个列表) 15=]).