在Python中使用模板字面值对2D列表进行排序



我有一个名为data的2D列表

data = [['ABC', 12, 3, 100],
['DEF', 10, 5, 200],
['GHI', 13, 3, 1000]]

和2个随机数n1n2(不限于2个数字)。当我运行我的程序时,n1和n2将被随机设置在[0-3]之间,因为数据在[0-3]之间有4列索引。然后根据n1和n2所指向的列对数据进行排序。

假设

n1= 2
n2= 3

因此,列表现在应该首先按第二列排序,如果第二列中的值相同,则应该根据第三列进行排序,依此类推,如下面的

所示
[['ABC', 12, 3, 100],
['GHI', 13, 3, 1000],
['DEF', 10, 5, 200]]
我期待着你的帮助。提前感谢

使用operator.itemgetter

from operator import itemgetter

data = [['ABC', 12, 3, 100],
['DEF', 10, 5, 200],
['GHI', 13, 3, 1000]]

indices = [2, 3]
res = sorted(data, key=itemgetter(*indices))
print(res)

[['ABC', 12, 3, 100], ['GHI', 13, 3, 1000], ['DEF', 10, 5, 200]]

这将适用于任何数量的索引。

您可以将元组传递给排序键:

sorted(data, key=lambda x: (x[n1],x[n2]))

你可以利用列表的.sort方法,它接受key函数,并在适当的地方工作,即

data = [['ABC', 12, 3, 100],
['DEF', 10, 5, 200],
['GHI', 13, 3, 1000]]
data.sort(key=lambda x:(x[2],x[3]))
print(data)

输出
[['ABC', 12, 3, 100], ['GHI', 13, 3, 1000], ['DEF', 10, 5, 200]]

lambda用于创建2元组,然后在排序过程中用作值

使用operator.itemgetter作为排序键函数:

from operator import itemgetter
indices = [2, 3]
data.sort(key=itemgetter(*indices))
# [['ABC', 12, 3, 100], 
#  ['GHI', 13, 3, 1000], 
#  ['DEF', 10, 5, 200]]