我有一个像这样的嵌套列表:
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]]
答案 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]]
然后要排序,您可以使用key
和reverse
参数
>>> 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 comprehension和slice 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