Поиск среднего значения списка в словаре - PullRequest
0 голосов
/ 09 мая 2020

Я создал словарь под названием 'alt_dict' , в котором я ищу усреднение значений в каждом соответствующем списке.

import statistics
datas = [['CC',      1,     0,     0,      0,    2.5],
         ['CC',      1,   4.5,     0,    4.5,    2.8],
         ['CC',      1,   9.5,     0,    9.5,    2.5],
         ['CC',      2,     0,   2.5,      0,      5],
         ['CC',      2,   4.5,   2.8,    4.5,      5],
         ['CC',      2,   9.5,   2.5,    9.5,      5],
         ['CC',      3,     0,     5,      0,    7.5],
         ['CC',      3,   4.5,     5,    4.5,    7.2],
         ['CC',      3,   9.5,     5,    9.5,    7.9]]
cc_list = []
alt_dict = {}

for i in range(len(datas)):
    if datas[i][0] == 'CC':
        cc_list.append(datas[i][1])
cc_list_plane = list(set(cc_list))

for y in cc_list_plane:
    alt_dict[y] = []

for i in range(len(datas)):
    if datas[i][0] == 'CC':
        key = datas[i][1]
        alt_dict[key].extend([datas[i][5]-datas[i][3]])
#        alt_dict[key].extend([statistics.mean(datas[i][5]-datas[i][3])])
print(alt_dict)

Я ищу следующее :

{1: [2.6], 2: [2.4], 3: [2.5333]}

Я пробовал использовать библиотеку 'statistics' с ее функцией 'mean' , но у меня возникла ошибка TypeError: объект 'float' не итерируемый.

Есть ли решение для такого случая? С уважением.

Ответы [ 2 ]

1 голос
/ 09 мая 2020
  • Текущая реализация неэффективна, потому что для создания ключей и заполнения alt_dict требуется несколько итераций над datas, плюс итерация для создания alt_dict.
  • В следующей реализации выполняется все с одним l oop и возвращает желаемый результат.
    • Использует .get() для проверки наличия ключа
from statistics import mean

alt_dict = dict()
for v in datas:
    if v[0] == 'CC':
        value = [v[5] - v[3]]
        if alt_dict.get(v[1]) == None:
            alt_dict[v[1]] = value
        else:
            alt_dict[v[1]].extend(value)

alt_dict = {k: mean(v) for k, v in alt_dict.items()}

print(alt_dict)

>>> {1: 2.6, 2: 2.4, 3: 2.5333333333333337}

Как функция:

def list_calcs(data: list, key: str, col1: int, col2: int) -> dict:
    """
    data: list of lists
    key: str of interest in data[0][0] -> 'CC'
    col1: data[0][col1]
    col2: data[0][col2]
    data[0][col1] - data[0][col2]
    """
    alt_dict = dict()
    for v in data:
        if v[0] == key:
            value = [v[col1] - v[col2]]
            if alt_dict.get(v[1]) == None:
                alt_dict[v[1]] = value
            else:
                alt_dict[v[1]].extend(value)

    return {k: mean(v) for k, v in alt_dict.items()}

alt_dict = list_calcs(datas, 'CC', 5, 3)
1 голос
/ 09 мая 2020

Попробуйте следующее:

res = {k: [sum(v)/len(v)] for k, v in alt_dict.items()}

Вывод:

{1: [2.6], 2: [2.4], 3: [2.5333333333333337]}

Используя statistics.mean()

res = {k: [statistics.mean(v)] for k, v in alt_dict.items()}
#{1: [2.6], 2: [2.4], 3: [2.5333333333333337]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...