如何解决python:自定义排序:不是纯粹的词典编排,而是反向和最短的通用优先
背景
我想反向排序,但不严格按字典顺序排序,然后它变得更加奇怪。: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}})。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。