在Python中,如果我想按照不完全按照字典顺序对字符串进行排序。我想要对字符串进行排序的顺序是字典顺序,除了
::
应该在
之前有一个空格。所以类似
# input
strings = ['apple::test', 'apple::test::test', 'apple test', 'apple::test test', 'banana::test', 'apple']
res = custom_sort(strings)
print(res)
# expected output
# ['apple', 'apple::test', 'apple test', 'apple::test::test', 'apple::test test', 'banana::test']
输入可以采用非常广泛的值。
我在 stackoverflow 上有这篇文章根据 Python 中的自定义字母表对字符串值进行排序但这仅涵盖对单个字符进行排序。一种可能的解决方案是将
::
替换为空格之前的一些特殊字符,然后排序,然后用 ::
替换这些字符。这个解决方案并不是最优的,因为我们用来替换 ::
的字符可能会与字符串中的其他字符形成冲突。例如,如果字符串已包含 ::
,则将 @
替换为 @
会导致问题。我本质上想将 ::
视为用于排序的新字母表中的字符。
您可以使用
key
函数来执行此操作,该函数将 "::"
替换为排序在 " "
之前的字符,例如 chr(1)
。当然,这不应该是出现在任何字符串中的字符。
strings = ['apple::test', 'apple::test::test', 'apple test', 'apple::test test', 'banana::test', 'apple']
res = sorted(strings, key=lambda s, c=chr(1): s.replace("::", c))