按两个字段对2D列表排序

时间:2018-12-05 20:13:24

标签: python python-3.x list sorting

假设我有一个2D列表:

data = []
data.append([7, 12, 19, 'Type1', 'New'])
data.append([1, 2, 21, 'Type3', 'New'])
data.append([12, 7, 22, 'Type2', 'Active'])
data.append([3, 0, 22, 'Type3', 'Active'])
data.append([0, 1, 18, 'Type2', 'Closed'])
data.append([13, 11, 19, 'Type1', 'Closed'])

我想按第四列和第五列对2d列表进行排序。我希望第4列按升序排列,但第5列按“新建”,“活动”,“关闭”的顺序排列。

所需的2d列表:

[7, 12, 19, 'Type1', 'New'])
[13, 11, 19, 'Type1', 'Closed'])
[12, 7, 22, 'Type2', 'Active'])
[0, 1, 18, 'Type2', 'Closed'])
[1, 2, 21, 'Type3', 'New'])
[3, 0, 22, 'Type3', 'Active'])

这行让我接近,但不太清楚:

sortedData = sorted(data, key=lambda x:(x[3],x[4]))

关于按两个字段排序的任何建议?

1 个答案:

答案 0 :(得分:2)

您可以构造字典优先级映射,然后使用tuple排序键:

priorities = {v: k for k, v in enumerate(['New', 'Active', 'Closed'])}

res = sorted(data, key=lambda x: (x[3], priorities[x[4]]))

print(res)

[[7, 12, 19, 'Type1', 'New'],
 [13, 11, 19, 'Type1', 'Closed'],
 [12, 7, 22, 'Type2', 'Active'],
 [0, 1, 18, 'Type2', 'Closed'],
 [1, 2, 21, 'Type3', 'New'],
 [3, 0, 22, 'Type3', 'Active']]