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