蟒蛇。基于两个键和一个字典对2D列表进行排序

时间:2017-12-19 15:11:32

标签: python list sorting dictionary key

我试图解决这个问题。 我有一个代码的dict:order。

codes = {'JA':0,'FE':1,'MA':2,'AP':3,'MY':4,'JU':5,'JL':6,'AG':7,'SE':8,'OC':9,'NO':10,'DI':11}

和样本数据:

sample = [['NO15',27],['JU17',45],['FE18',-4],['AP14',7],['JA18',97]]

我希望根据两个标准对样本进行排序。首先,年份,也就是它,本月代码附带的两位数字,以及字典中月份的顺序 结果必须是:

sorted_sample = [['AP14',7],['NO15,27],['JU17',45],['JA18',97],['FE18',-4]]

我正在尝试用这个

sorted(raw, key=lambda x: (x[2:4],codes.get(x[0][:2])))

sorted(sorted(raw, key = lambda x : x[2:4], reverse = True), key = lambda x : codes.get(x[0][:2]), reverse = False)

但我没有得到正确的结果。

3 个答案:

答案 0 :(得分:1)

你可以试试这个:

import re
codes = {'JA':0,'FE':1,'MA':2,'AP':3,'MY':4,'JU':5,'JL':6,'AG':7,'SE':8,'OC':9,'NO':10,'DI':11}
sample = [['NO15',27],['JU17',45],['FE18',-4],['AP14',7],['JA18',97]]
final_sample = sorted(sample, key=lambda x: (int(re.findall('\d+$', x[0])[0]), codes[re.findall('^[a-zA-Z]+', x[0])[0]], x[-1]))

输出:

[['AP14', 7], ['NO15', 27], ['JU17', 45], ['JA18', 97], ['FE18', -4]]

答案 1 :(得分:1)

您需要索引列表才能获得年份。另外,将其转换为int,以便将其作为数字进行比较:

>>> sorted(sample, key=lambda x: (int(x[0][2:4]), codes.get(x[0][:2])))
[['AP14', 7], ['NO15', 27], ['JU17', 45], ['JA18', 97], ['FE18', -4]]

答案 2 :(得分:0)

感谢你们两位。我在代码中发现了错误。我试图在[2:4]之后将样本的元素转换为整数。我忘了只选择第一部分。 int(x [0] [2:4])而不是int(x [2:4])。