Python 根据在另一个列表中定义的元素位置对嵌套列表进行排序

Python 根据在另一个列表中定义的元素位置对嵌套列表进行排序,python,list,sorting,nested,Python,List,Sorting,Nested,假设我有一个嵌套列表,如: my_list = [[1, 1, "c1"], [1, 2, "c1"], [5, 1, "c2"], [5, 2, "c2"], [6, 1, "c3"], [6, 2, "c3"], [2, 1, "c4"], [2, 2, "c4"], [3, 1, "c5"], [3, 2, "c5"], [4, 1, "c6"], [4, 2, "c6"]] 我还拥有另一个列表,根据该列表,需要对my_listlist的每个元素执行排序。假设其定义为: ordering

假设我有一个嵌套列表,如:

my_list = [[1, 1, "c1"], [1, 2, "c1"], [5, 1, "c2"], [5, 2, "c2"], [6, 1, "c3"], [6, 2, "c3"], [2, 1, "c4"], [2, 2, "c4"], [3, 1, "c5"], [3, 2, "c5"], [4, 1, "c6"], [4, 2, "c6"]]
我还拥有另一个列表,根据该列表,需要对
my_list
list的每个元素执行排序。假设其定义为:

ordering = [2, 1]
现在我想按多个参数对列表进行排序。首先,我想按列表
排序
,它应该按索引[1]处的
列表
中的项目排序,然后我想按索引[0]处的列表中的项目排序。总而言之,我最终想要的是:

list = [[1, 2, "c1"], [2, 2, "c4"], [3, 2, "c5"], [4, 2, "c6"], [5, 2, "c2"], [6, 2, "c3"], [[1, 1, "c1"], [2, 1, "c4"], [3, 1, "c5"], [4, 1, "c6"], [5, 1, "c2"], [6, 1, "c3"]

有没有(更可取的Pythonic)方法可以做到这一点?欢迎您的建议

要根据
排序进行排序,您可以尝试以下方法:

l = [[1, 1, "c1"], [1, 2, "c1"], [5, 1, "c2"], [5, 2, "c2"], [6, 1, "c3"], [6, 2, "c3"], [2, 1, "c4"], [2, 2, "c4"], [3, 1, "c5"], [3, 2, "c5"], [4, 1, "c6"], [4, 2, "c6"]]
ordering = [2, 1]
new_l = sorted(l, key=lambda x:[x[ordering[0]-1], x[ordering[1]-1]])
输出:

[[1, 1, 'c1'], [2, 1, 'c4'], [3, 1, 'c5'], [4, 1, 'c6'], [5, 1, 'c2'], [6, 1, 'c3'], [1, 2, 'c1'], [2, 2, 'c4'], [3, 2, 'c5'], [4, 2, 'c6'], [5, 2, 'c2'], [6, 2, 'c3']]

使用Lambda表达式

您可以使用具有以下lambda表达式的函数作为
键来实现它:

#             v  'i-1' since your `ordering` list is holding
#             v   position instead of `index`
lambda x: [x[i-1] for i in ordering]
此lambda表达式将根据
排序
列表中的索引返回
my_列表
列表中每个元素的值列表。根据返回的列表,将执行排序

样本运行:

>>> my_list = [[1, 1, "c1"], [1, 2, "c1"], [5, 1, "c2"], [5, 2, "c2"], [6, 1, "c3"], [6, 2, "c3"], [2, 1, "c4"], [2, 2, "c4"], [3, 1, "c5"], [3, 2, "c5"], [4, 1, "c6"], [4, 2, "c6"]]
>>> ordering = [2, 1]

>>> sorted(my_list, key=lambda x: [x[i-1] for i in ordering])
[[1, 1, 'c1'], [2, 1, 'c4'], [3, 1, 'c5'], [4, 1, 'c6'], [5, 1, 'c2'], [6, 1, 'c3'], [1, 2, 'c1'], [2, 2, 'c4'], [3, 2, 'c5'], [4, 2, 'c6'], [5, 2, 'c2'], [6, 2, 'c3']]
使用

更好的做法是使用as:


您可以使用operator模块中的itemgetter来构造排序的键

from operator import itemgetter
l =  [[1, 1, "c1"], [1, 2, "c1"], [5, 1, "c2"], [5, 2, "c2"], [6, 1, "c3"], [6, 2, "c3"], [2, 1, "c4"], [2, 2, "c4"], [3, 1, "c5"], [3, 2, "c5"], [4, 1, "c6"], [4, 2, "c6"]]
ordering = [1, 0]
new_l = sorted(l, key=itemgetter(*order))

有试过吗?稍微修改了我的问题。答案现在不会产生期望的输出。在得到答案后不要回答问题。对于第一个问题,您有几种解决方案,现在请找出如何使答案适应您的新问题。如果你做不到,那就重新研究一下,也许会提出一个新问题。因此,没有快速代码原型服务可以为您的问题提供解决方案,
问题1
问题2
问题3
问题4
——为此,请雇佣一个敏捷的编码团队。
from operator import itemgetter
l =  [[1, 1, "c1"], [1, 2, "c1"], [5, 1, "c2"], [5, 2, "c2"], [6, 1, "c3"], [6, 2, "c3"], [2, 1, "c4"], [2, 2, "c4"], [3, 1, "c5"], [3, 2, "c5"], [4, 1, "c6"], [4, 2, "c6"]]
ordering = [1, 0]
new_l = sorted(l, key=itemgetter(*order))