Как исключить наибольшее число списка из расчетов - PullRequest
2 голосов
/ 06 февраля 2020

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

original_list = [[0.5, 1.4, 2.1, 5.2], [2.3, 3.2, 5.3, 2.1], [1.3, 3.1, 2.1, 5.3]]
result_list = [[-3.87], [-2.77], [-3.13]] 

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

Ответы [ 5 ]

1 голос
/ 06 февраля 2020

вы можете сначала получить список со всеми максимальными значениями из ваших вложенных списков, а затем отфильтровать вложенные списки по максимальным значениям

max_values = [max(l) for l in original_list]
with_no_max = [[e for e in l if e < m] for l, m in zip(original_list, max_values)]

print(max_values)
print(with_no_max)

вывод:

[5.2, 5.3, 5.3]
[[0.5, 1.4, 2.1], [2.3, 3.2, 2.1], [1.3, 3.1, 2.1]]
1 голос
/ 06 февраля 2020

Одна строка:

import numpy as np
res = [[np.mean(sorted(i)[:-1])-sorted(i)[-1]] for i in original_list]
print(res)
1 голос
/ 06 февраля 2020

Pure python решения

original_list = [[0.5, 1.4, 2.1, 5.2], [2.3, 3.2, 5.3, 2.1], [1.3, 3.1, 2.1, 5.3]]

def mean_no_max(l):
    s, m = 0, float('-inf')
    for i in l:
        s += i
        m = m if m > i else i
    return [(s - m) / (len(l) - 1) - m]

print(list(map(mean_no_max, original_list)))  # -> [[-3.86], [-2.76], [-3.13]]

Забавный подход с одной итерацией по l с использованием max() и sum()

def mean_no_max(l):
    s = [0]
    def update_sum(x):
        s[0] += x
        return x
    max_value = max(l, key=update_sum)
    return (s[0] - max_value) / (len(l) - 1) - max_value

def mean_no_max(l):
    class Adder:
        def __init__(self, num=0, max_value=float('-inf')):
            self.num = num
            self.max_value = max_value
        def __add__(self, other):
            self.num += other
            if other > self.max_value:
                self.max_value = other
            return self
    adder = sum(l, Adder())
    return (adder.num - adder.max_value) / (len(l) - 1) - adder.max_value
1 голос
/ 06 февраля 2020

как понимание

from numpy import mean

original_list = [[0.5, 1.4, 2.1, 5.2], [2.3, 3.2, 5.3, 2.1], [1.3, 3.1, 2.1, 5.3]]

result_list = [[round(mean([v for v in list_ if v !=max(list_)])-max(list_), 2)] for list_ in original_list]
print(result_list)
1 голос
/ 06 февраля 2020

Мы можем l oop по списку, отсортировать каждый подсписок и затем выполнить вычисление, добавив результат в список результатов.

import numpy as np
original_list = [[0.5, 1.4, 2.1, 5.2], [2.3, 3.2, 5.3, 2.1], [1.3, 3.1, 2.1, 5.3]]

rv = []

for x in original_list:
    l = sorted(x)
    rv.append([np.mean(l[:-1])-l[-1]])

Вывод:

>>> rv
[[-3.866666666666667], [-2.766666666666666], [-3.1333333333333333]]

Для округления значений используйте rv.append([round(np.mean(l[:-1])-l[-1], 2)]):

>>> rv
[[-3.87], [-2.77], [-3.13]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...