2015-04-06 5 views
1

У меня есть список списков, как такPython - Усредненные элементы в списке списков

[[name1, 10.10], [name2, 12.12], [name1, 9.90], [name3, 22.20], [name3, 7.70]] 

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

[[name1, 10.00], [name2, 12.12], [name3, 14.95]] 

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

+0

Почему были удалены три элемента? –

+3

Вы хотите, чтобы каждое имя отображалось только один раз в вашем конечном списке, правильно? Если это так, вы не хотите использовать список для своей окончательной структуры, вам нужен словарь. – pseudonym117

+0

Ваш последний результат - 7,70' или '7,70'? – Kasramvd

ответ

0

Вы можете использовать словарь для хранения каждого имени с соответствующими значениями:

>>> from __future__ import division 
>>> l=[['name1', 10.1], ['name2', 12.12], ['name1', 9.9], ['name3', 22.2], ['name3', 7.70]] 
>>> d={} 
>>> for i in l: 
...  d.setdefault(i[0],[]).extend(i[1:]) 
... 
>>> d 
{'name2': [12.12], 'name3': [22.2, 7.7], 'name1': [10.1, 9.9]} 
>>> [[i,sum(j)/len(j)] for i,j in d.items()] 
[['name2', 12.12], ['name3', 14.95], ['name1', 10.0]] 

Note, что этот ответ будет работать, если у вас есть больше, что 1 число в ваших подсписках !!

Но в этом случае, как я пишу, прежде чем редактировать, вы можете просто сделать:

>>> from __future__ import division 
>>> l=[['name1', 10.1], ['name2', 12.12], ['name1', 9.9], ['name3', 22.2], ['name3', 7.70]] 
>>> d={} 
>>> for i,j in l: 
...  d.setdefault(i,[]).append(j) 
... 
>>> d 
{'name2': [12.12], 'name3': [22.2, 7.7], 'name1': [10.1, 9.9]} 
>>> [[i,sum(j)/len(j)] for i,j in d.items()] 
[['name2', 12.12], ['name3', 14.95], ['name1', 10.0]] 
+0

Среднее значение для 'name3' не равно 17.3666. –

+0

@ zachgates7 Я думал, что его опечатка от OP, спасибо за напоминание, исправлена! – Kasramvd

+0

Это не '33.066'; обратите внимание, как в вопросе среднее значение равно 14.95. «7,70» в вопросе - опечатка. –

0

Вы можете использовать простую функцию для перебора элементов:

def averageItems(items): 
    averages = {} 
    for name, data in items: 
     averages.setdefault(name, []).append(data) 
    for name, data in averages.items(): 
     averages[name] = sum(data)/len(data) 
    return averages 

Затем используйте список:

data = [[name1, 10.10], [name2, 12.12], [name1, 9.90], [name3, 22.20], [name3, 7.70]] 
dataAverages = averageItems(data) # {name3: 14.95, name2: 12.12, name1: 10.0} 
+0

Ваш пример не работает. Вы забыли указать строки. –

+0

Я отредактировал вопрос в соответствии с сообщением. У столбца нет котировок, указывающих, что они являются переменными. @MauroBaraldi –

+0

Но вы вставляете пример, как вы бежали в оболочке. Конечно, это не сработало, когда вы вставляете. –

0
  1. Построить словарь, значения которого представляют собой списки чисел, используя метод словарей .setdefault().
  2. Создайте список, используя встроенные функции sum и len, чтобы вычислить среднее значение.

Использование ipython переводчика

In [1]: l = [['name1', 10.10], ['name2', 12.12], ['name1', 9.90], ['name3', 22.20], ['name3', 7.70]] 
In [2]: d = {} 
In [3]: for k, v in l: d[k]=d.setdefault(k,[])+[v] 
In [4]: [[k,sum(d[k])/len(d[k])] for k in d] 
Out[4]: [['name2', 12.12], ['name3', 14.95], ['name1', 10.0]] 
In [5]: del d 
In [6]: 

Kevin's comment to the OP Движимые о возможной потребности в сохранении порядка ярлыков в первоначальном списке, я хотел бы предложить, используя OrderedDict из модуля

collections
In [19]: from collections import OrderedDict 
In [20]: d = OrderedDict() 
In [21]: for k, v in l: d[k]=d.setdefault(k,[])+[v] 
In [22]: [[k,sum(d[k])/len(d[k])] for k in d] 
Out[22]: [['name1', 10.0], ['name2', 12.12], ['name3', 14.95]] 
+1

Так в чем разница с моим ответом? :) – Kasramvd

+1

Я не знаю, я не читал ваш ответ. – gboffi

0

Вы можете использовать collections.defaultdict, чтобы сохранить все оценки для каждого имени в одном списке, а затем использовать statistics.mean, если у вас есть python> = 3.4, чтобы вычислить среднее:

from collections import defaultdict 
from statistics import mean 

l = [['name1', 10.10], ['name2', 12.12], ['name1', 9.90], ['name3', 22.20], ['name3', 7.70]] 


details = defaultdict(list) 

for name, score in l: 
    details[name].append(score) 

Если вы хотите сохранить структуру Dict просто обновить значения:

for name, scores in details.items(): 
    details[name] = mean(scores) 

print(details) 
defaultdict(<class 'list'>, {'name3': 14.95, 'name1': 10.0, 'name2': 12.12}) 

Или создать список, используя список понимание:

print([[name ,mean(scores)] for name,scores in details.items()]) 
[['name1', 10.0], ['name3', 14.95], ['name2', 12.12]] 

Очевидно без использования средств вы можете просто вычислить его самостоятельно:

print([[name , sum(scores)/len(scores)] for name,scores in details.items()]) 

Если порядок имеет значение затем использовать collections.OrderedDict:

from collections import OrderedDict 
details = OrderedDict() 

for name, score in l: 
    details.setdefault(name,[]) 
    details[name].append(score) 

print([[name , sum(scores)/len(scores)] for name,scores in details.items()]) 
+0

Использование 'mean' отлично, если у вас более 3.x. Если нет, вам придется суммировать и разделить вручную (ужас ~) –

+0

@ap. Я уже сказал, что вам нужен python 3.4 или выше. Это действительно работает и дает правильный результат, я уверен, что ОП может понять, как усреднить, не используя среднее значение. –

+0

Вы правы, я просто пропустил это сначала (не читал вашу преамбулу). Не бил, просто указывая на это. –

0
from collections import defaultdict 
from operator import add 

d = defaultdict(list) 
pairs = [[name1, 10.10], [name2, 12.12], [name1, 9.90], [name3, 22.20], [name3, 7.70]] 

for name, val in pairs: 
    d[name].append(val) 
print [(name, reduce(add, vals)/len(vals)) for name, vals in d.items()] 

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

+0

Ваша последняя строка должна быть 'print ([[name, reduce (add, vals)/len (vals)] для имени, vals в d.items()])' –

+0

Спасибо за упоминание '.items()' part , –

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