Как найти среднее значение массива, который имеет два элемента в Python? - PullRequest
0 голосов
/ 10 ноября 2018

Мне нужно найти среднее значение массива, например: [('a', 5), ('b', 2), ('a', 4), ('b', 6)]

Результат должен быть как; [('a', 4.5), ('b', 4)]

Ответы [ 5 ]

0 голосов
/ 10 ноября 2018

При желании вы также можете попробовать приведенный ниже код многократного использования (без использования каких-либо внешних библиотек).

>>> def get_mean(l):
...     d = {}
...     for k, v in l:
...         if k in d:
...             d[k].append(v)
...         else:
...             d[k] = [v]
...     result = [(k, sum(d[k])/len(d[k])) for k in d]
...     return result
...
>>> l = [('a', 5), ('b', 2), ('a', 4), ('b', 6)]
>>> new_l = get_mean(l)
>>> new_l
[('a', 4.5), ('b', 4.0)]
>>>
0 голосов
/ 10 ноября 2018

Необработанное решение без дополнительных библиотек может выглядеть так:

def mean(l):
    result = {}
    for key, value in l:
        if key not in result:
            result[key] = []
        result[key].append(value)

    return [(k, sum(v)/len(v)) for k, v in result.items()]

lst = [('a', 5), ('b', 2), ('a', 4), ('b', 6)]
m = mean(lst)

print(m)
# [('a', 4.5), ('b', 4.0)]
0 голосов
/ 10 ноября 2018

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

from collections import defaultdict

d = defaultdict(list)

for key,value in [('a', 5), ('b', 2), ('a', 4), ('b', 6)]:
    d[key].append(value)

mean = []

for k,values in d.items():
    # mean.append((k,sum(values)/float(len(values)))) #python 2
    mean.append((k,sum(values)/len(values)))

print(mean) # [('a', 4.5), ('b', 4.0)]
0 голосов
/ 10 ноября 2018

Мы можем использовать панд для этого:

import pandas as pd

pd.DataFrame(data).groupby(0)[1].mean().to_dict()

это даст нам:

>>> pd.DataFrame(data).groupby(0)[1].mean().to_dict()
{'a': 4.5, 'b': 4.0}

или мы можем преобразовать это в список из двух кортежей с помощью:

list(pd.DataFrame(data).groupby(0)[1].mean().to_dict().items())

, что дает:

>>> list(pd.DataFrame(data).groupby(0)[1].mean().to_dict().items())
[('a', 4.5), ('b', 4.0)]

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

0 голосов
/ 10 ноября 2018

Вы можете собрать числа с помощью collections.defaultdict(), а затем применить statistics.mean() к каждой группе номеров:

from statistics import mean
from collections import defaultdict

lst = [('a', 5), ('b', 2), ('a', 4), ('b', 6)]

d = defaultdict(list)
for k, v in lst:
    d[k].append(v)

means = [(k, mean(v)) for k, v in d.items()]

print(means)
# [('a', 4.5), ('b', 4)]

Вы также можете использовать itertools.groupby() для группировки кортежей:

from statistics import mean
from itertools import groupby
from operator import itemgetter

lst = [("a", 5), ("b", 2), ("a", 4), ("b", 6)]

means = [
    (k, mean(map(itemgetter(1), g)))
    for k, g in groupby(sorted(lst, key=itemgetter(0)), key=itemgetter(0))
]

print(means)
[('a', 4.5), ('b', 4)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...