Python 对相应列表进行排序

Python 对相应列表进行排序,python,sorting,dictionary,Python,Sorting,Dictionary,首先,我的目标是:我想在matplotlib中生成一个条形图,然后从Django模型中获取数据 为了得到一组解释过的数据,我必须将它们与另一个模型的数据相乘。这就是为什么我不能通过queryset进行排序(至少我认为我不能) 这给我留下了两个列表(每年):标签-字符串-和数据-浮动- 很简单,我可以使用sort(Data)对数据进行排序,但这显然不会改变标签的顺序 我想到的第一件事是字典,就像元组一样,是不可变的 有一种订购字典的方法——这是一个很棒的图书馆——但让我烦恼的是,我必须打包一本字典

首先,我的目标是:我想在matplotlib中生成一个条形图,然后从Django模型中获取数据

为了得到一组解释过的数据,我必须将它们与另一个模型的数据相乘。这就是为什么我不能通过queryset进行排序(至少我认为我不能)

这给我留下了两个列表(每年):标签-字符串-和数据-浮动-

很简单,我可以使用
sort(Data)
对数据进行排序,但这显然不会改变标签的顺序

我想到的第一件事是字典,就像元组一样,是不可变的

有一种订购字典的方法——这是一个很棒的图书馆——但让我烦恼的是,我必须打包一本字典,而不是通过互联网订购

OrderedDict(sorted(d.items(), key=lambda t: t[1]))
OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])
然后在两个列表中再次解包,将其交给函数

matplotlib.bar(x, values, labels=keys)
这对我来说是非常不雅的,我不得不这样做4次(4年的数据)

你将如何解决这个问题

编辑: 关于Django模型的更多信息(草图;)


否我将
使用量
co2
相乘,并根据能量来源改变数据

多亏了jonrsharpe和martin,我找到了答案,并愿意与大家分享:

#Zip the list
sort_year = list(zip(values, labels))
#Sortig the list
sort_year.sort()
#pitfall: the list will be in reversed order
values, labels = zip(*sort_year)

你看,从大到小排序,我完全惊讶了

我认为另一种可能的解决方案是使用numpy阵列:

import numpy as np
values   = np.array(values)
labels   = np.array(labels)
sort_vec = np.argsort( values )[::-1]
values   = values[ sort_vec ]
labels   = labels[ sort_vec ]

您可以将
zip
压缩为两个元组
(标签,数据)
。我希望有一种方法可以说,例如Mathplotlib,订购我的条形图和标签,或者hey django给我一些解决我问题的东西-因此我添加了标签;)呵呵,不,但不管怎样都很容易。。您只需
myitems=dict(zip(标签、值))
,排序,然后将
myitems.keys()
myitems.values()
传递给matplotlib,这没有什么难看或低效的地方。你可能可以直接在Django中排序,但是你需要向我们提供更多关于模型的信息(你说你在用一个乘以另一个)@Martin你不需要编写
dict
,只需
。排序
来自
zip
的元组列表。很酷的东西,更好:)
import numpy as np
values   = np.array(values)
labels   = np.array(labels)
sort_vec = np.argsort( values )[::-1]
values   = values[ sort_vec ]
labels   = labels[ sort_vec ]