我有一个从最大值到最小值的整数列表,如下所示:[2345,67,24,24,11,11,6,6,6,6,6,3,3,3,3,3,1,1,1,1,1,1]
我只想计算此列表中每个值的部分,例如5%为'1',4%为'3',1%为2345并打印出此结果
有什么简单的方法可以做到这一点?
答案 0 :(得分:3)
一种方式。我相信会有更好的方法来做到这一点。
import collections
d = collections.defaultdict(float)
ip = [2345,67,24,24,11,11,6,6,6,6,6,3,3,3,3,3,1,1,1,1,1,1]
length = len(ip)
for i in ip:
d[i] += 1
for i in d:
print "%5d : %.2f%%" % (i, (d[i]/length) * 100)
答案 1 :(得分:2)
此解决方案利用了这样一个事实:您的元素已经被排序,并且只进行一次原始列表传递(以及通过剩余数据结构的常量传递。
>>> from itertools import groupby
>>> x = [2345,67,24,24,11,11,6,6,6,6,6,3,3,3,3,3,1,1,1,1,1,1]
>>> grouped_x = [(k, sum(1 for i in g)) for k,g in groupby(x)]
>>> grouped_x
[(2345, 1), (67, 1), (24, 2), (11, 2), (6, 5), (3, 5), (1, 6)]
groupby
表达式是从first question I ever asked on SO借来的,基本上只是将每个具有相同值的连续块组合成list
个(值,实例生成器)对。然后外部列表理解只是将实例生成器转换为它们的总长度。
我认为OP的数据不准确,但这似乎与他所得到的相似。我采用了天花板功能,但你也可以round
>>> from math import ceil
>>> for k, v in grouped_x:
print int(ceil(100 * v / float(len(x)))),
print "% is", k
5 % is 2345
5 % is 67
10 % is 24
10 % is 11
23 % is 6
23 % is 3
28 % is 1
答案 2 :(得分:0)
不是一个简单的函数,而是一些列表理解:
x = [2345,67,24,24,11,11,6,6,6,6,6,3,3,3,3,3,1,1,1,1,1,1]
print [(i,x.count(i) * 100 / len(x)) for i in set(x)]
将打印
[(1, 27), (67, 4), (6, 22), (2345, 4), (11, 9), (3, 22), (24, 9)]
这是元素/百分比对。
答案 3 :(得分:0)
from collections import Counter, OrderedDict
items_count = len(x)
percentage_tuples = map(lambda tup: (tup[0], 100 * float(tup[1]) / items_count),
Counter(x).most_common())
percentage_dict = OrderedDict(percentage_tuples)
percentage_dict
将按照从高到低的顺序排序。
将其打印出来:
for item in percentage_tuples:
print("%d%% is '%s'" % (item[1], item[0]))