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