排序相应的列表

时间:2014-10-08 11:01:32

标签: python sorting dictionary

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

为了获得一组解释的数据,我必须将它们与来自其他模型的数据相乘。这就是为什么我不能通过查询集排序(至少我认为我不能)

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

我很容易用sort(data)对数据进行排序,但这显然不会改变标签的顺序。

我想到的第一件事就是像词典这样的词典是不可变的。

有一种订购字典的方法 - collections是一个了不起的图书馆 - 但令我困扰的是,我必须打包一本字典,而不是通过

订购字典。
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模型的更多信息(草图;))

class EnergieSource(Models):
      name = models.CharField(max_length=30)
      co2 = models.FloatField('CO²-Equivalent')
class EnergieUsage(Models):
      date = models.DateField('Year')
      energiesource = models.ForeignKeyField(EnergieSource)
      usage = models.FloatField('Yearly use in MWh')

不,我将usageco2相乘,并根据EnergySource改变数据。

2 个答案:

答案 0 :(得分:1)

感谢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)

你去了 - 从大多数到最不重要 - 我完全惊讶!

答案 1 :(得分:1)

我认为另一种可能的解决方案是使用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 ]