2015-04-10 3 views
1

У меня есть кортеж, который в настоящее время выглядит следующим образом:Сортировка кортежей средними

[['Hussain', 7, 8, 0], ['Max', 3, 4, 3], ['Alexandra', 10, 9, 8]] 

Я хочу, чтобы иметь возможность сортировать этот кортеж так, что она выводит кортеж в порядке от самых высоких до самых низких средних. Это то, что я ожидаю в результате:

['Alexandra', 9],['Hussain', 5],['Max', 3.3333333333] 

Я хотел бы получить любую помощь.

ТИА

+0

Кстати, у вас есть список не tuple –

+0

О, хорошо, тогда что отличает список и кортеж? - Я полностью забыл. – Hussain

+0

Проверьте этот пост, чтобы узнать о различиях: http://stackoverflow.com/questions/626759/whats-the-difference-between-list-and-tuples –

ответ

3
from statistics import mean 
from operator import itemgetter 
l = [['Hussain', 7, 8, 0], ['Max', 3, 4, 3], ['Alexandra', 10, 9, 8]] 

print(sorted(([ele[0],mean(ele[1:])] for ele in l),key=itemgetter(1),reverse=True)) 

[['Alexandra', 9.0], ['Hussain', 5.0], ['Max', 3.3333333333333335]] 

Если вы не используете питона> = 3.4 вы можете просто сделать средний расчет вручную.

print(sorted(([ele[0],sum((ele[1:]))/len(l) - 1] for ele in l),key=itemgetter(1),reverse=True)) 

ele[0],mean(ele[1:]) принимает имя и остальные элементы, которые являются оценки, мы затем отсортировать с помощью itemgetter(1) который является оценка/второй элемент в качестве ключа и настройки reverse=True для перехода от высокого к низкому.

Я хотел бы также использовать itertools.islice, чтобы получить кусочек, избегая строить новые списки с нормальной нарезкой:

from itertools import islice 
print(sorted(([ele[0],mean(islice(ele,1,None))] for ele in l),key=itemgetter(1),reverse=True)) 

Или без использования среднего:

from itertools import islice 
print(sorted(([ele[0],sum(islice(ele,1,None))/len(l) - 1] for ele in l),key=itemgetter(1),reverse=True)) 
+0

Спасибо за быстрый ответ, я действительно ценю это :) – Hussain

+0

@ Hussainm не беспокоится, вас приветствует –

+0

Является ли «ele» синтаксисом python? или это то, что вы использовали как индекс. – Hussain

1
s = [['Hussain', 7, 8, 0], ['Max', 3, 4, 3], ['Alexandra', 10, 9, 8]] 
result = sorted([[e[0], sum(e[1:])/len(e[1:])] for e in s], key=lambda x: x[1], reverse=True) 
+0

Сортировка требует повторения. Я использую понимание списка, чтобы отсортировать первый параметр: [[e [0], sum (e [1:])/len (e [1:])] для e в s] => [[' Hussain ', 5.0], [' Max ', 3.3333333333333335], [' Alexandra ', 9.0]] – Jaakko

+0

Я использовал timeit, чтобы посмотреть, как наши функции сравниваются. С номером = 10000, ваш ответ получает: 1,5141523819997929 Mine получает: +0,08450542999980826 – Jaakko

+0

Вашего первый ответа: из статистики импорта среднего от импорта оператора itemgetter отсортированных (([Эле [0], средний (Ele [1:])] для ele in l), key = itemgetter (1), reverse = True) Возможно, импорт замедляет его. В любом случае, в чем проблема с моим ответом? Это быстро, одна строка, понятные и понятные списки. – Jaakko

Смежные вопросы