2015-06-04 3 views
2

У меня есть вложенный список, как так:не разработка в среднем

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

перечень содержит все месяцы вплоть до декабря с 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]] 

ответ

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]] 
+0

Можете ли вы объяснить свой код? У меня возникают проблемы с пониманием понимания списков. – PythonNewBee

+0

Есть ли что-то конкретное в понимании списка, которое неясно? Или вы не знакомы с синтаксисом понимания списка вообще? – CoryKramer

+0

Я нахожу синтаксис, который трудно понять вообще для понимания списка ... Я действительно хочу узнать и понять код. – PythonNewBee

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, как ключ вашей сортированной функции для сортировки результата на основе второго элемента (в среднем)

+0

У этой проблемы есть проблема с Кори: она включает повторение максимальной температуры при вычислении среднего значения. – TigerhawkT3

0

Понимание более list comprehension и slice notation действительно поможет вам сделать это просто с помощью py тонический код.

Чтобы объяснить @ первый ответ 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.

+0

Большое спасибо всем парням поддержки, это был первый вопрос, который я задал, и поддержка неоценима. Я многое узнал от вопроса. Особенно спасибо за объяснение jdfLemon и всех остальных. – PythonNewBee

+0

@PythonNewBee, просто имейте в виду, что большинство ответов дают средние значения с максимальной температурой, подсчитанной дважды. – TigerhawkT3

+0

Да, мне удалось это решить. Приветствия для головы – PythonNewBee

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 
Смежные вопросы