Python:按键的前半部分对字典进行重新排序

时间:2018-07-30 15:39:45

标签: python dictionary key

我需要通过其键的第一个'CSV'重新排序非常大的OrderedDict。例如,我有一个这样的字典:

 a = {'40,70': AAAAAA, '0,12': XXXXXXXX, '20,38': YYYYY}

我需要在键的第一个数字上对其进行排序,该键始终是两个数字,并以逗号分隔(然后我需要第二个数字作为排序因子)。值或字母目前不重要。我需要像这样:

b = {'0,12': XXXXXXXX, '20,38': YYYYY, '40,70': AAAAAA}

字典太大,无法在循环中拆分每个键-是否有更快的方法? 我试图使这一点尽可能清楚。

谢谢。

5 个答案:

答案 0 :(得分:3)

您可以使用有序字典来对字典进行重新排序

from collections import OrderedDict  
OrderedDict(sorted(a.items(), key=lambda ele:[int(item) for item in ele[0].split(',')])) 

答案 1 :(得分:2)

最好的方法是在字典中创建tuple键,然后使用自然顺序进行排序。

如果要将键保留为字符串,则将字典中的项排序为一个元组,并使用键函数将键转换为整数元组。如果前两个数字相等,这将提供决胜局:

a = {'40,70': "AAAAAA", '0,12': "XXXXXXXX", '0,10': "XXXXXXXX", '20,38': "YYYYY"}

import collections

b = collections.OrderedDict(sorted(a.items(),key = lambda e : tuple(map(int,e[0].split(",")))))

print(b)

结果:

OrderedDict([('0,10', 'XXXXXXXX'), ('0,12', 'XXXXXXXX'), ('20,38', 'YYYYY'), ('40,70', 'AAAAAA')])

答案 2 :(得分:0)

使用第二个数字作为决胜局:

ordered_dict = dict(sorted(a.items(), key=lambda x: [int(x[0].split(",")[0]), int(x[0].split(",")[1])]))

答案 3 :(得分:0)

我认为使用OrderedDict可以使用类似这样的东西。 我不确定这是否是最快的方法。

要进行数字排序,我假设您总是在逗号前得到一个整数。

要将第二部分用作第二个键,并将该键变成一个元组。

from collections import OrderedDict
a = {'40,70': 'AAAAAA', '0,12': 'XXXXXXXX', '20,38': 'YYYYY', '0,38': 'AAYY'}
b = OrderedDict(sorted(a.items(), key=lambda x: (int(x[0].split(',')[0]), int(x[0].split(',')[1]))))
print(b)

结果是

OrderedDict([('0,12', 'XXXXXXXX'), ('0,38', 'AAYY'), ('20,38', 'YYYYY'), ('40,70', 'AAAAAA')])

答案 4 :(得分:-2)

使用OrderedDict

from collections import OrderedDict

a = {'40,70': 'AAAAAA', '0,12': 'XXXXXXXX', '20,38': 'YYYYY'}

b = OrderedDict(sorted(a.items()))