python中的简单计算

python中的简单计算,python,Python,我有一个从最大值到最小值的整数列表,如下所示:[2345,67,24,24,11,11,6,6,6,6,6,3,3,3,3,3,1,1,1,1,1] 我只想计算这个列表中每个值的部分,比如5%是“1”,4%是“3”,1%是2345,然后打印出这个结果 做这件事的简单方法是什么?不是一个简单的函数,而是一点列表理解: 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(

我有一个从最大值到最小值的整数列表,如下所示:
[2345,67,24,24,11,11,6,6,6,6,6,3,3,3,3,3,1,1,1,1,1]

我只想计算这个列表中每个值的部分,比如5%是“1”,4%是“3”,1%是2345,然后打印出这个结果


做这件事的简单方法是什么?

不是一个简单的函数,而是一点列表理解:

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

这是一对元素/百分比。

不是一个简单的函数,而是一点列表理解:

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

这是一对元素/百分比。

单向。我相信会有更好的方法去做

   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)

单程。我相信会有更好的方法去做

   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)

此解决方案利用了元素已经排序的事实,只对原始列表进行一次传递(并对剩余的数据结构进行恒定次数的传递)

>>> 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
表达式借用自,基本上只是将具有相同值的每个连续块分组为(值,实例生成器)对的
list
。然后外部列表理解只是将实例生成器转换为它们的总长度

我认为OP的数字不准确,但这似乎是他想要的。我使用了天花板函数,但你也可以
取整

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

此解决方案利用了元素已经排序的事实,只对原始列表进行一次传递(并对剩余的数据结构进行恒定次数的传递)

>>> 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
表达式借用自,基本上只是将具有相同值的每个连续块分组为(值,实例生成器)对的
list
。然后外部列表理解只是将实例生成器转换为它们的总长度

我认为OP的数字不准确,但这似乎是他想要的。我使用了天花板函数,但你也可以
取整

>>> 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
百分比将按比例从高到低排序

要打印出来:

for item in percentage_tuples:
    print("%d%% is '%s'" % (item[1], item[0]))
百分比将按比例从高到低排序

要打印出来:

for item in percentage_tuples:
    print("%d%% is '%s'" % (item[1], item[0]))


…唯一的问题是您的值都不是OP期望的值!:(详细信息,详细信息…有更有效的算法,但我正在寻找一个线性。订购后,很容易在O(n)中解决…唯一的问题是您的值都不是OP期望的值!:(细节,细节…有更有效的算法,但我正在寻找一个线性。订购后,很容易用O(n)来求解。你能澄清一下“每个值的部分”是什么意思吗?是的。请澄清。我的回答假设你指的是
1
3
等元素的分数,以百分比表示。从问题的措辞来看,我会假设这是一个百分位问题,但数字与该假设相差甚远。你尝试了什么?请发布你开始时使用的代码。你可以吗稍微澄清一下“每个值的部分”是什么意思?是的。请澄清。我的回答假设你指的是
1
3
等元素的分数,以百分比表示。从问题的措辞来看,我会假设这是一个百分位问题,但数字与该假设相差甚远。你尝试了什么?请发布你开始使用的代码。这就是为什么lution也与OP的预期输出不匹配……但它很好!:)很难匹配OP的预期输出,因为他给出的百分比与示例不符。@rodrigo-你不能排除你误解了OP想要什么,事实上,他的数字与示例相符……应用了正确的计算。@mac可能……但我敢打赌他只给出了近似的v将值转换为百分比,因为如果他知道实际值,他首先就不需要问!问题的标题是“python中的简单计算”,而不是“如何格式化百分比输出”。我很确定重要的部分是计算有序列表的百分比组成的算法。此解决方案也与OP的预期输出不匹配…但它很好!:)很难匹配OP的预期输出,因为他给出的百分比与示例不符。@rodrigo-你不能排除你误解了OP想要什么,事实上,他的数字与示例相符……应用了正确的计算。@mac可能……但我敢打赌他只给出了近似的v将值转换为百分比,因为如果他知道实际值,他首先就不需要问!问题的标题是“python中的简单计算”,而不是“如何格式化百分比输出”。我很确定重要的部分是计算有序列表的百分比组成的算法。另一个答案与预期输出不匹配…但做得很好!:)我相信它现在匹配了。但是我不认为输出的格式是这个问题最重要的一点。整洁。我喜欢
itertools
中的示例,因为这是我使用得不够的一个方面。另一个答案与预期输出不匹配…但做得很好!)我相信它现在是匹配的。但是我不认为输出的格式是这个问题最重要的。整洁。我喜欢
itertools
中的例子,因为这是我使用得不够的东西之一。这是不可读的,会让大多数用户在手册页上停留大约3个小时。你觉得哪一行不可读?有2行集合已导入,只使用了它们的方法。带有lambda的映射可能有点不可读,但仔细查看后,它已经足够好了。此代码用于学习如何制作东西。我建议编写计数器的子类