python - Python中的条件计数

标签 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))

现在我想计算字段 b = 1 的列表元素。我想出了两个解决方案:

print [e.b for e in stuff].count(1)

print len([e for e in stuff if e.b == 1])

哪种方法最好?有更好的选择吗?似乎 count() 方法不接受 key (至少在 Python 2.5.1 版本中。

非常感谢!

最佳答案

sum(x.b == 1 for x in L)

bool 值(由 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

因此,在这种情况下,生成一个额外的临时列表并检查其长度的“内存浪费”方法实际上比我更喜欢的更简单、更短、节省内存的方法要快得多。当然,列表值的其他组合、Python 实现、用于“投资”加速的内存可用性等,都会影响确切的性能。

关于python - Python中的条件计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1764309/

相关文章:

python - 通过计算 python 中 groupby 之后的列中 0 出现的次数来获取子集

c - 指针读取不正确

C++数组转移到元素

python - 迭代两个等长列表并将每对的最大值附加到新列表的更简单/首选方法?

javascript - 如何从值列表中获取键?

c# - 如何将 List<> 作为字段存储在数据库中? - C#(SQL Server 精简版)

Python:从命令行传递库函数

python - Django 消息显示两次

MySQL Workbench 的 Python 模块不工作

Python for 循环只保存我的二维数组中的最后一个循环