如何计算列表中具有重复项的每个值的平均值?

时间:2018-02-15 07:09:23

标签: python list duplicates average

我正在努力编写一个能够遍历数字列表[2, 4, 3, 2, 2]并重新计算重复值的函数,以便本例中的所有2将总和(= 6)然后将除以列表的长度。长度= 5。 输出:[6/5, 4, 3, 6/5, 6/5]

每个号码必须留在它的位置,输入列表中的数字可以是正数和负数。 关于如何处理的任何想法?

3 个答案:

答案 0 :(得分:5)

首先,让我们导入Counter并定义您的列表:

>>> from collections import Counter
>>> x = [2, 4, 3, 2, 2]

其次,我们创建ctrCounter的一个实例,它将包含列表中每个元素出现的次数:

>>> ctr = Counter(x)

最后,让我们创建您想要的新列表:

>>> [i if ctr[i]==1 else ctr[i]*i/len(x) for i in x]
[1.2, 4, 3, 1.2, 1.2]

i if ctr[i]==1 else ctr[i]*i/len(x)是三元声明。如果i只出现i,则评估结果为x。否则,评估i i出现在x的次数除以xctr[i]*i/len(x)的长度{。}}。

答案 1 :(得分:2)

您可以使用列表理解

<强>实施例

t = [2, 4, 3, 2, 2]
print [float(i * t.count(i)) / float(len(t)) if t.count(i) > 1 else i for i in t]

<强>输出

[1.2, 4, 3, 1.2, 1.2]

答案 2 :(得分:1)

您可以使用itertools.groupby对所有元素进行分组

>>> from itertools import groupby
>>> k = [(k,len(list(g)) for k,g in groupby(sorted(l))]

这将为格式(element, frequency)列表的每个元素提供元组:

>>> [(2, 3), (3, 1), (4, 1)]

接下来从这个元组列表中创建一个映射dict

>>> mapping = dict(k)
>>> mapping 
>>> {2: 3, 3: 1, 4: 1}

现在替换原始列表中映射dict中的值大于1的所有元素

>>> [map[k]*k/len(l) if map[k] > 1 else k for k in l]
>>> [1.2, 4, 3, 1.2, 1.2]