首页 > 解决方案 > 在python中使用特定顺序对元素进行排序

问题描述

按字典顺序对所有字符串进行排序,但如果一个字符串完全作为前缀出现在另一个字符串中,那么长度较长的字符串应该排在第一位。

例如 1 个测试,testtube 是 2 个字符串,字符串测试作为前缀出现在 testtube

分类-试管,测试。

例如 2银行、蚂蚁、试管、测试

sorted-蚂蚁, 银行, 试管, 测试

我们如何在 python 中做到这一点?尝试了很多,但没有任何解决方案,需要帮助。

标签: pythonsorting

解决方案


也许在每个字符串的末尾附加一个“不可能大”的字符?

def sort(a):
   return sorted(a, key=lambda s: s + chr(0x10FFFF))

演示:

>>> sort(['test', 'testtube'])
['testtube', 'test']

>>> sort(['bank', 'ant', 'testtube', 'test'])
['ant', 'bank', 'testtube', 'test']

>>> sort(['test', 'testbb', 'testa'])
['testa', 'testbb', 'test']

它是最大的代码点(chr甚至给出ValueError更大的代码点),实际上是一个“非字符”,不应该自然发生,但我们可以自由地使用它:

非字符是在 Unicode 标准中永久保留供内部使用的代码点。不建议将它们用于 Unicode 文本数据的开放交换。[...] 应用程序可以在内部自由使用任何这些非字符代码点。

在该部分的后面,该标准甚至建议了这种用法(强调我的):

[...] U+10FFFF 与最大的合法 UTF-32 32 位代码单元值 10FFFF 16相关联。此属性将这两个非字符代码点呈现为对内部目的有用的哨兵。例如,它们可能用于指示列表的结尾,表示索引中的值保证高于任何有效字符值,等等。


推荐阅读