锻炼平均水平

时间:2015-06-04 19:22:47

标签: python sorting

我有一个像这样的嵌套列表:

temperature = [["Jan", 12, 18, 16, 18], ["Feb", 10, 20, 50, 50], ["Mar", 23, 32, 10, 32]]

该列表包含截至12月的所有月份,其中整个月记录了3个最高临时值,然后是列表末尾附加3个中的最高值。

我通过以下方式计算出每个月的最高温度:

def sortTemp():
    for temp in temperatures:
        temp = [temp[0], temp[4]]
        highest.append(temp)
    highest.sort()
    print(highest)

这是有效的,但我必须预先计算出最大值,并将其附加到温度列表中,如上所述。有更简单的方法吗?

另外,如何使用温度列表中提供的数据计算每个月的平均温度,按最高平均值排序?

输出应该是:

AverageTemp = [["Month", AverageTemp], ["Month", AverageTemp]] 

4 个答案:

答案 0 :(得分:2)

您可以使用列表推导来计算平均值

>>> AverageTemp = [[i[0], sum(i[1:])/len(i[1:])] for i in temperature]
>>> AverageTemp
[['Jan', 16.0], ['Feb', 32.5], ['Mar', 24.25]]

或者如果你有numpy

>>> import numpy as np
>>> AverageTemp = [[i[0], np.mean(i[1:])] for i in temperature]
>>> AverageTemp
[['Jan', 16.0], ['Feb', 32.5], ['Mar', 24.25]]

然后要排序,您可以使用keyreverse参数

>>> AverageTemp = sorted([[i[0], np.mean(i[1:])] for i in temperature], key = lambda i: i[1], reverse = True)
>>> AverageTemp
[['Feb', 32.5], ['Mar', 24.25], ['Jan', 16.0]]

答案 1 :(得分:1)

您可以在sorted函数中使用列表推导:

>>> from operator import itemgetter
>>> sorted([[l[0],sum(l[1:])/4]for l in temperature],key=itemgetter(1),reverse=True)
[['Feb', 32], ['Mar', 24], ['Jan', 16]]

在前面的代码中,首先循环遍历列表,然后按[l[0],sum(l[1:])/4]获取第一个元素和其余的平均值,并使用operator.itemgetter作为已排序函数的键,以根据第二项(平均值)

答案 2 :(得分:0)

了解有关list comprehensionslice notation的更多信息,只需使用pythonic代码即可帮助您完成此操作。

解释@ CoryKramer的第一个答案:

>>> AverageTemp = [[i[0], sum(i[1:4])/len(i[1:4])] for i in temperature]
>>> AverageTemp
[['Jan', 15], ['Feb', 26], ['Mar', 21]]

他正在做的是使用i在温度列表中循环(这是一个列表列表),然后使用切片表示法来获取所需的信息。因此,显然i[0]是您的月份,但符号sum(i[1:4])使用切片表示法获取列表中从索引1到3的项目总和。然后他按长度划分并创建AverageTemp列表列表以及您需要的信息。

注意:根据@ TigerhawkT3的评论,我已经编辑了他的答案,不包括两次高温。

答案 3 :(得分:0)

对于给定的数据,这不是一个非常好的结构:您将不同的项目(一个月的名称,温度,最高温度)作为无差别的列表元素。我会推荐字典或对象。

months = {"Jan":[12, 18, 16], "Feb":[10, 20, 50], "Mar":[23, 32, 10]}
for month in sorted(months, key=lambda x: sum(months.get(x))/len(months.get(x)), reverse=True):
    temps = months.get(month)
    print(month, max(temps), sum(temps)/len(temps))

结果:

Feb 50 26.666666666666668
Mar 32 21.666666666666668
Jan 18 15.333333333333334
class Month:
    def __init__(self, name, *temps):
        self.name = name
        self.temps = temps
    def average(self):
        return sum(self.temps)/len(self.temps)
    def maximum(self):
        return max(self.temps)
months = [Month('Jan', 12, 18, 16), Month('Feb', 10, 20, 50), Month('Mar', 23, 32, 10)]
for month in sorted(months, key=lambda x: x.average(), reverse=True):
    print(month.name, month.maximum(), month.average())

结果:

Feb 50 26.666666666666668
Mar 32 21.666666666666668
Jan 18 15.333333333333334