如何从计算中排除列表的最大数量

How to exclude the biggest number of a list from calculations

我有一个包含浮点数的列表列表,我想获取列表中所有项目的平均值,但总是将最大的数字排除在外。然后应从平均值中减去未包括的一个浮点数,因为这将是最大的差异。然后我想创建一个列表来放入差异。

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]] 

我不知道如何从计算中排除最大的数字,因为它总是在另一个位置。

我们可以遍历列表,对每个子列表进行排序,然后执行计算,将结果附加到结果列表。

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]]

纯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]]

使用 max()sum()

l 上进行单次迭代的有趣方法
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

理解

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)

一行:

import numpy as np
res = [[np.mean(sorted(i)[:-1])-sorted(i)[-1]] for i in original_list]
print(res)

您可以先从嵌套列表中获取包含所有最大值的列表,然后按最大值过滤嵌套列表

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]]