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

Python:按键的前半部分对字典重新排序,python,dictionary,key,Python,Dictionary,Key,我需要按其密钥的第一个“CSV”对一个非常大的OrderedICT进行重新排序。例如,我有一本这样的字典: a = {'40,70': AAAAAA, '0,12': XXXXXXXX, '20,38': YYYYY} b = {'0,12': XXXXXXXX, '20,38': YYYYY, '40,70': AAAAAA} 我需要它在键的第一个数字上排序,它总是由逗号分隔的两个数字(我需要第二个数字作为排序因子)。这些值或字母目前并不重要。我需要它是这样的: a = {'40,70

我需要按其密钥的第一个“CSV”对一个非常大的OrderedICT进行重新排序。例如,我有一本这样的字典:

 a = {'40,70': AAAAAA, '0,12': XXXXXXXX, '20,38': YYYYY}
b = {'0,12': XXXXXXXX, '20,38': YYYYY, '40,70': AAAAAA}
我需要它在键的第一个数字上排序,它总是由逗号分隔的两个数字(我需要第二个数字作为排序因子)。这些值或字母目前并不重要。我需要它是这样的:

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

字典太大,无法在循环中拆分每个键-有没有更快的方法? 我已经尽可能清楚地说明了这一点


谢谢。

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

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

第二个号码作为分接器:

ordered_dict = dict(sorted(a.items(), key=lambda x: [int(x[0].split(",")[0]), int(x[0].split(",")[1])]))
使用有序的信息技术

from collections import OrderedDict

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

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

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

如果希望将键保留为字符串,则将字典中的项排序为元组,并使用键函数将键转换为整数元组。在第2种情况下,这提供了一个平局断路器,第一个数字相等:

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')])

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

字典至少要到3.6版或正式的3.7版才会被订购。是否需要一个
OrderedDict
?“字典太大,无法在循环中拆分每个键”很遗憾,您必须在要使用的任何排序键中执行此操作。那么,为什么不直接使用整数元组作为键,这样就不需要提供排序键呢?是的,我确实需要一个OrderedDict,但仅此一点并没有帮助。它不会只按钥匙的“一半”来订购物品。如果前两个数字相等,您是否需要平分牌?这个内存需求不明确,我需要第二个数字作为排序因子。@Jean-Françoisfare chang itertiems to items
map(int,ele[0]。split(','))
仍然不符合python 3。您不需要
map
here@Jean-弗朗索瓦·法布我认为地图仍然是我们的关键词python3@Jean-弗朗索瓦·法布我把地图改成了更好的综合地图。
map
不能用作排序键的原因是它返回一个生成器函数,而不是预期的列表。因此,在Python3中,提供列表键不起作用它不排序numericalyit不排序numericalyadded int()将排序键转换为integermade更改为使用dict键的第二部分,因为tie breaker我正要说,我忘了提到键的第二部分可能也需要排序。谢谢