如何对具有不同顺序的字符串列表进行排序



我正在用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']

相关内容

  • 没有找到相关文章

最新更新