Python находит медиану в списке списков - PullRequest
0 голосов
/ 19 сентября 2019

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

norm_row_list = [[0.0, 0.0, 0.0, 0.0, 0.17795385258743912, 0.0677184881194031], [0.5884873389626358, 0.3198112142984678, 0.8174664500409363, 0.6671642766717503, 0.32139709168355723, 1.0], [0.6396995276767564, 0.688061628145554, 0.6534818573661288, 0.019976903098259637, 0.0, 0.27760511005151], [0.7329666273317014, 0.9057703742992778, 0.7434609459640676, 0.8374816423664811, 0.016863091072428376, 0.0], [0.4842313879485761, 0.4510016620800218, 0.625429283659689, 0.38608275062838593, 0.1259237700382603, 0.9794600361121459]]

В настоящее время использую этот код

n = len(norm_row_list)
s = sorted(norm_row_list)
median = [float(sum(s[n//2-1:n//2+1])/2.0, s[n//2])[n % 2] if n else None]
print(median)

Но получил ошибку

    median = [float(sum(s[n//2-1:n//2+1])/2.0, s[n//2])[n % 2] if n else None]
TypeError: unsupported operand type(s) for +: 'int' and 'list'

Ответы [ 2 ]

1 голос
/ 19 сентября 2019

На самом деле у вас есть несколько способов, самый простой из которых будет просто использовать numpy:

import numpy as np
m = np.median(norm_row_list)
print(m)

Если вы хотите распаковать свой список списка, вы можете сделать это с пониманием вложенного списка:

import numpy as np
l = l = [i for x in norm_row_list for i in x]
m = np.median(l)
print(m)

Но я предлагаю заглянуть в itertools и изучить эту библиотеку:

import itertools
import numpy as np
l =  list(itertools.chain(norm_row_list))
m = np.median(l)
print(m)

Конечно, вы можете заменить np.median своим расчетом, но я предлагаю вам вставить его вфункция, позволяющая сделать ваш режим кода компактным и читабельным.

0 голосов
/ 19 сентября 2019

Свести список списков, как описано в Как создать плоский список из списка списков , а затем использовать модуль statistics для вычисления медианы.

import itertools
import statistics

norm_row_list = [...]

flat_norm_row_list = list(itertools.chain(*norm_row_list))
flat_norm_row_list_median = statistics.median(flat_norm_row_list)
print(flat_norm_row_list_median)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...