nic*_*aum 26 python arrays list count
不确定之前有人问过,但我找不到明显的答案.我正在尝试计算列表中等于某个值的元素数.问题是这些元素不是内置类型.所以,如果我有
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版本中).
非常感谢!
Ale*_*lli 45
sum(x.b == 1 for x in L)
Run Code Online (Sandbox Code Playgroud)
一个布尔(如从比较如所得x.b == 1)也是int,具有值0为False,1对True,所以算术如求和工作得很好.
这是最简单的代码,但也许不是最快的(只能timeit告诉你肯定;-).考虑(简化的情况,以适应命令行,但等效):
$ py26 -mtimeit -s'L=[1,2,1,3,1]*100' 'len([x for x in L if x==1])'
10000 loops, best of 3: 56.6 usec per loop
$ py26 -mtimeit -s'L=[1,2,1,3,1]*100' 'sum(x==1 for x in L)'
10000 loops, best of 3: 87.7 usec per loop
Run Code Online (Sandbox Code Playgroud)
因此,对于这种情况,生成额外临时列表并检查其长度的"内存浪费"方法实际上比我更喜欢的更简单,更短,更节省内存的方法更快.列表值的其他组合,Python实现,在这种加速中"投入"的内存可用性等,当然可以影响确切的性能.
小智 15
print sum(1 for e in L if e.b == 1)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
24177 次 |
| 最近记录: |