Как я могу получить вложенный словарь и найти медиану значения без импорта модулей? - PullRequest
1 голос
/ 24 марта 2020

У меня есть набор данных, которые я сгруппировал по месяцам, и я хотел бы получить вложенный словарь и найти среднее значение для каждого года ... Как я могу это кодировать? Я только начал с Python, поэтому я надеюсь, что код может быть ясным и понятным.

dictionary = {1: [
                  [2019, 28.7], 
                  [2019, 29.4], 
                  [2019, 29.7], 
                  [2020, 28.6], 
                  [2020, 28.7], 
                  [2020, 28.0]
                 ],
              2:[
                 [2018, 26.9], 
                 [2018, 28.2],  
                 [2018, 28.5], 
                 [2019, 29.9],
                 [2019, 29.8], 
                 [2019, 28.7]
                ]}


desired output = {1: {2019: 29.4, 2020: 28.7},
                  2: {2018: 28.2, 2019: 29.8}} 

Большое спасибо всем, кто внес свой вклад! Я решил эту проблему.

Ответы [ 2 ]

0 голосов
/ 24 марта 2020

вы можете использовать словарь с выводом itertools.groupby:

from itertools import groupby
from statistics import median

{k : {y : median((e[1] for e in g)) for y, g in groupby(v, key=lambda x: x[0])} for k, v in dictionary.items()}

:

{1: {2019: 29.4, 2020: 28.6}, 2: {2018: 28.2, 2019: 29.8}}

вышеприведенное решение работает, потому что ваши данные отсортированы по году


или вы можете использовать 2 for петли с collection.defaultdict :

from collections import defaultdict

output = {}

for k, v in dictionary.items():
    year_value = defaultdict(list)
    for y, val in v:
        year_value[y].append(val)

    output[k] = {y: median(v) for y, v in year_value.items()}

print(output)

output:

{1: {2019: 29.4, 2020: 28.6}, 2: {2018: 28.2, 2019: 29.8}}
0 голосов
/ 24 марта 2020

Попробуйте это ниже:

dictionary = {1: [[2019, 28.7], [2019, 29.4], [2019, 29.7], [2020, 28.6], [2020, 28.7], [2020, 28.0]],
                  2: [[2018, 26.9], [2018, 28.2], [2018, 28.5], [2019, 29.9], [2019, 29.8], [2019, 28.7]]}

    output = {}
    for obj in dictionary.keys():
        temp = {}
        for i in dictionary[obj]:
            if i[0] not in temp:
                temp[i[0]] = [i[1]]
            else:
                temp[i[0]].append(i[1])
        output[obj] = temp

    for i in output.keys():
        for j in output[i].keys():
            output[i][j].sort()
            n = len(output[i][j])
            if n % 2 == 0:
                median_1 = output[i][j][n // 2]
                median_2 = output[i][j][n // 2 - 1]
                median = (median_1 + median_2) // 2
            else:
                median = output[i][j][n // 2]
            output[i][j] = median

    print(output)
...