一种简单的方法
rank = ['+A', 'A', '-A', '+B', 'B', '-B', ...]
sorted(d.items(), key=lambda i: rank.index(i[0]))
如果有很多等级,最好使用adict
rank = {'+A': 0, 'A': 1, '-A': 2, '+B': 3, 'B': 4, '-B': 5, ...}
sorted(d.items(), key=lambda i: rank[i[0]])
您可以使用这样的 lambda 函数。请注意,使用后向切片以确保字母在其修饰符之前排序很重要。
sorted(d.items(), key=lambda i:(','+i[0])[::-1])
但我认为显式rank
更清晰,不容易出现@Hari 答案中的错误。(到目前为止,有 5 人投了票而没有注意到这个错误)
如果您真的只需要对键进行排序(为什么?),您可以简单地使用rank.get
而不是 lambda 函数:
>>> rank = {'+A': 0, 'A': 1, '-A': 2, '+B': 3, 'B': 4, '-B': 5, '+C': 6, 'C': 7, '-C': 8}
>>> d = {'+A':234, '-B':212, 'A':454, '-C':991, '-A':124}
>>> sorted(d, key=rank.get)
['+A', 'A', '-A', '-B', '-C']
但最好sorted
完全跳过
>>> rank = ['+A', 'A', '-A', '+B', 'B', '-B', '+C', 'C', '-C']
>>> d = {'+A':234, '-B':212, 'A':454, '-C':991, '-A':124}
>>> [k for k in rank if k in d]
['+A', 'A', '-A', '-B', '-C']
如果你讨厌输入所有这些'
>>> rank = '+A A -A +B B -B +C C -C'.split()