我正在用Python编写一个函数,它可以对我的列表进行排序。问题是我不希望它与sorted()
方法使用的顺序相同。我尝试使用 sorting()
方法,但是当我对这个字符串进行排序时,它的结果是这样的:
0123456789abcdefghijklmnopqrstuvwxyzßàáäåæçèéêìíîñòóôöøùúüžα
我希望它的顺序是:
0123456789aàáäåæbcçdeèéêfghiìíîjklmnñoòóôöøpqrsßtuùúüvwxyzžα
现在,我有一个这样的列表(示例):
list = ['x', 'h', 'ê', 'ø', '5', 'ž', 'z', 'α', '3', '1']
我想要这样排序。如果我使用 sorted()
方法,它将如下所示:
['1', '3', '5', 'h', 'x', 'z', 'ê', 'ø', 'ž', 'α']
但我希望它与我之前给出的字符串的顺序相同。
这个想法是按指定的顺序将索引关联到每个字符,并使用字符串字符的索引进行顺序比较。
注意:仅适用于Python 3
对一个字符字符串进行排序
ORDER = "0123456789aàáäåæbcçdeèéêfghiìíîjklmnñoòóôöøpqrsßtuùúüvwxyzžα"
# associate each char with the index in the string
# this makes sort faster for multiple invocations when compared with
# ORDER.index(c)
POS = {c:p for (p, c) in enumerate(ORDER)}
lst = ['x', 'h', 'ê', 'ø', '5', 'ž', 'z', 'α', '3', '1']
lst.sort(key = lambda c: POS[c])
# or, suggested by wim
lst.sort(key = POS.get)
对任意长度的字符串进行排序
class MyStrOrder:
def __init__(self, inner):
self.inner = inner
def __lt__(self, other):
for i in range(min(len(self.inner), len(other.inner))):
a = POS.get(self.inner[i])
b = POS.get(other.inner[i])
if a != b:
return a < b
return len(self.inner) < len(other.inner)
lst = ["abc", "ab", "aá"]
lst.sort()
print(lst)
lst = ["abc", "ab", "aá"]
lst.sort(key = MyStrOrder)
print(lst)
输出:
['ab', 'abc', 'aá']
['aá', 'ab', 'abc']