我正在努力编写一个能够遍历数字列表[2, 4, 3, 2, 2]
并重新计算重复值的函数,以便本例中的所有2将总和(= 6)然后将除以列表的长度。长度= 5。
输出:[6/5, 4, 3, 6/5, 6/5]
每个号码必须留在它的位置,输入列表中的数字可以是正数和负数。 关于如何处理的任何想法?
答案 0 :(得分:5)
首先,让我们导入Counter
并定义您的列表:
>>> from collections import Counter
>>> x = [2, 4, 3, 2, 2]
其次,我们创建ctr
,Counter
的一个实例,它将包含列表中每个元素出现的次数:
>>> 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
的次数除以x
:ctr[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]