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



我有一个带有浮点数的列表列表,并希望获取列表中所有项目的平均值,但总是省略最大的数字。然后应从均值中减去未包括的一个浮点数,因为这将是最大的差异。然后我想创建一个列表来放置差异。

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
res = [[np.mean(sorted(i)[:-1])-sorted(i)[-1]] for i in original_list]
print(res)

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

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

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

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

作为理解

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)

纯 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

最新更新