不确定之前有人问过,但我找不到明显的答案.我正在尝试计算列表中等于某个值的元素数.问题是这些元素不是内置类型.所以,如果我有
class A:
def __init__(self, a, b):
self.a = a
self.b = b
stuff = []
for i in range(1,10):
stuff.append(A(i/2, i%2))
Run Code Online (Sandbox Code Playgroud)
现在我想计算其字段b = 1的列表元素.我想出了两个解决方案:
print [e.b for e in stuff].count(1)
Run Code Online (Sandbox Code Playgroud)
和
print len([e for e in stuff if e.b == 1])
Run Code Online (Sandbox Code Playgroud)
哪种方法最好?还有更好的选择吗?似乎count()方法不接受键(至少在Python 2.5.1版本中).
非常感谢!
我得到(非常偶尔)C代码和Python代码之间略有不同的计算结果,并设法找到一个例子.在Python中,我得到了这个:
>>> print "%.55f" %\
... (-2.499999999999999555910790149937383830547332763671875 *\
... -2.499999999999999555910790149937383830547332763671875)
6.2499999999999982236431605997495353221893310546875000000
>>> print "%.55f" %\
... ((-2.499999999999999555910790149937383830547332763671875) ** 2)
6.2499999999999973354647408996243029832839965820312500000
>>> print "%.55f" %\
... math.pow(-2.499999999999999555910790149937383830547332763671875, 2)
6.2499999999999973354647408996243029832839965820312500000
Run Code Online (Sandbox Code Playgroud)
而在C中,以下程序:
#include<math.h>
#include<stdio.h>
int main(){
printf("%.55f\n", -2.499999999999999555910790149937383830547332763671875\
* -2.499999999999999555910790149937383830547332763671875);
printf("%.55f\n",\
pow(-2.499999999999999555910790149937383830547332763671875, 2));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
给出以下结果:
6.2499999999999982236431605997495353221893310546875000000
6.2499999999999982236431605997495353221893310546875000000
Run Code Online (Sandbox Code Playgroud)
它变得更糟.跑步bc -l,我得到以下内容:
-2.499999999999999555910790149937383830547332763671875 *\
-2.499999999999999555910790149937383830547332763671875
6.249999999999997779553950749687116367962969071310727
Run Code Online (Sandbox Code Playgroud)
这似乎是正确的结果; 卡西欧的在线高精度计算器表示赞同.
令我担心的,但是,是(var * var),(var ** 2)和math.pow(var, 2)偶尔给的结果稍有不同(我使用Python 2.7.6).
谁知道为什么?