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



我需要按键的第一个"CSV"对一个非常大的OrderedDict进行重新排序。例如,我有一本这样的字典:

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

我需要按键的第一个数字排序,这个数字总是用逗号分隔的两个数字(我需要第二个数字作为排序因子(。值或字母当前不重要。我需要它是这样的:

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

字典太大了,无法将每个键分割成一个循环——有更快的方法吗?我已尽力使这一点尽可能清楚。

谢谢。

您可以使用有序dict对dict 进行重新排序

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

最好的方法是在字典中创建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')])

以第二个数字作为决胜局:

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

我认为使用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')])

使用OrderedDict

from collections import OrderedDict
a = {'40,70': 'AAAAAA', '0,12': 'XXXXXXXX', '20,38': 'YYYYY'}
b = OrderedDict(sorted(a.items()))

最新更新