如何按用户定义的顺序对列表中的列表进行排序?

时间:2016-01-11 12:13:11

标签: python list python-2.7 sorting

我想按列表中的优先顺序(*,/,+, - )对数学运算符列表(存储为字符串)进行排序。我的列表中有数千个列表。

E.g。

my_lists = [['*','+','-'],['-','*','*'],['+','/','-']]

应该成为:

new_list = [['*','+','-'],['*','*','-'],['/','+','-']]

有没有办法按用户定义的顺序对列表中的列表进行排序?

3 个答案:

答案 0 :(得分:6)

我们的想法是创建一个新的运算符列表,并将运算符存储在您想要的所需优先级中(您可以随时更改优先级),然后使用运算符索引作为key进行排序

您可以通过将key传递给排序函数来执行此操作:

my_lists = [['*','+','-'],['-','*','*'],['+','/','-']]
operators = ['*', '/', '+', '-']

new_list = [sorted(i, key = operators.index) for i in my_lists]
>>> [['*', '+', '-'], ['*', '*', '-'], ['/', '+', '-']]

然而你在问题中提到了一个元组(*,/,+,-),所以我尝试使用列表来解决问题,但是使用字典会像@thefourtheye建议的那样更清晰。

答案 1 :(得分:6)

您可以使用字典定义优先级,例如

>>> priority = {'*': 0, '/': 1, '+': 2, '-': 3}

然后使用priority中的值对单个列表进行排序,如下所示

>>> [sorted(item, key=priority.get) for item in my_lists]
[['*', '+', '-'], ['*', '*', '-'], ['/', '+', '-']]

答案 2 :(得分:2)

您必须使用key方法的可选.sort()参数。

如果您想就地执行此操作:

for sublist in my_lists:
    sublist.sort(key="*/+-".index)

或者如果您想创建一个新列表:

new_list = [sorted(sublist, key="*/+-".index) for sublist in my_lists]

请注意,如果您有许多列表,使用dictionnary可能会更有效:

d = {"*": 0, "/": 1, "+": 2, "-": 3}
key = d.get