按月份对字典中的字典进行排序

3

我有以下字典:

myList= {'Green Cars': {'April': 11455.0, 'March': 12210, 'February': 2559, 'August': 1439, 'July': 4921, 'January': 340, 'December': 340, 'November': 340, 'October': 306, 'September': 6}, 
'Yellow cars': {'April': 192914, 'March': 20187, 'February': 20994, 'January': 230625, 'December': 208422, 'November': 17914, 'October': 170835, 'September': 185357, 'July': 226697, 'May': 1852, 'August': 22096}, 
'Red Cars': {'April': 159, 'March': 1400, 'February': 2620, 'January': 237, 'August': 2959, 'July': 6943},...

我该如何按月份排序每个主键(“绿色汽车”,“黄色汽车”,“红色汽车”等)?
我已经知道如何根据内部字典对字典进行排序,其中二级键是相同的,但当它发生变化时就不行了。
最终,我将对它们进行排序,以获得通过matplotlib展示不同汽车的按月份的图表。
例如:enter image description here
1个回答

3
你有两个问题:对嵌套字典进行排序并维护排序结果。在Python中,字典是无序的。
要对你所用的示例字典进行排序,可以采取以下方法:
import calendar 
months=list(calendar.month_name)       # use a dict if you have lots of data...
myDictODicts= {'Green Cars': {'April': 11455.0, 'March': 12210, 'February': 2559, 'August': 1439, 'July': 4921, 'January': 340, 'December': 340, 'November': 340, 'October': 306, 'September': 6}, 
'Yellow cars': {'April': 192914, 'March': 20187, 'February': 20994, 'January': 230625, 'December': 208422, 'November': 17914, 'October': 170835, 'September': 185357, 'July': 226697, 'May': 1852, 'August': 22096}, 
'Red Cars': {'April': 159, 'March': 1400, 'February': 2620, 'January': 237, 'August': 2959, 'July': 6943}}

for k in myDictODicts:
    print(k, sorted(myDictODicts[k].items(), key=lambda t: months.index(t[0])))

输出:

Green Cars [('January', 340), ('February', 2559), ('March', 12210), ('April', 11455.0), ('July', 4921), ('August', 1439), ('September', 6), ('October', 306), ('November', 340), ('December', 340)]
Yellow cars [('January', 230625), ('February', 20994), ('March', 20187), ('April', 192914), ('May', 1852), ('July', 226697), ('August', 22096), ('September', 185357), ('October', 170835), ('November', 17914), ('December', 208422)]
Red Cars [('January', 237), ('February', 2620), ('March', 1400), ('April', 159), ('July', 6943), ('August', 2959)]

您可以使用元组列表或直接重新创建字典。在Python 3.6中,您可以将排序后的元组列表转换回字典,并保持插入顺序。您还可以使用OrderedDict,它会以与dict相同的方式显示给代码的其他部分。
示例:
from collections import OrderedDict
nd={}
for k in myDictODicts:
    nd[k]=OrderedDict(sorted(myDictODicts[k].items(), key=lambda t: months.index(t[0])))

>>> nd
{'Green Cars': OrderedDict([('January', 340), ('February', 2559), ('March', 12210), ('April', 11455.0), ('July', 4921), ('August', 1439), ('September', 6), ('October', 306), ('November', 340), ('December', 340)]), 'Yellow cars': OrderedDict([('January', 230625), ('February', 20994), ('March', 20187), ('April', 192914), ('May', 1852), ('July', 226697), ('August', 22096), ('September', 185357), ('October', 170835), ('November', 17914), ('December', 208422)]), 'Red Cars': OrderedDict([('January', 237), ('February', 2620), ('March', 1400), ('April', 159), ('July', 6943), ('August', 2959)])}

这看起来很有前途!我如何使用OrderedDict?我能够通过for k in data: newList[k] = sorted(data[k].items...)向新字典添加内容,所以太好了!我会阅读关于OrderedDict的资料,但是是否有一个快速的一两行摘要,告诉我为什么我可能想使用它而不是返回一个省略OrderedDict()的新字典? - BruceWayne
1
Python dicts (在Python 3.6之前)是无序的。您可以使用collections模块中的OrderedDict创建一个保持插入顺序的字典。在Python 3.6(以及后续版本)中,这将是默认行为,以保持插入顺序。 - dawg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接