Python中如何以‘任意整数’为条件统计列表中指定类实例的出现次数?
嘿,你的那个if写法是完全不对的,咱们来拆解问题,一步步搞定它~
首先说下你原来代码的问题:
- 你用了
=赋值运算符,而不是==比较运算符,这会直接给listEle赋值,根本做不了判断 - 就算改成
==,创建新的A(desiredCharacter, any(...))去比较也没用——默认情况下,Python的类实例比较的是内存地址,哪怕两个实例的构造参数完全一样,它们也是不同的对象,除非你给类A实现了__eq__方法 - 另外
any(1,2,3,...)的用法也错了,any()需要传入一个可迭代对象(比如列表),而且这里你根本不需要关心第二个参数的值,所以完全没必要用它
正确的实现思路
要统计符合要求的A实例,你需要两步判断:
- 先确认当前元素是类A的实例(排除字符串元素)
- 再检查这个实例的构造第一个参数等于你要找的值(前提是类A把这个参数存在了实例属性里,不然外部访问不到)
首先先确保你的类A是这样写的(把构造参数存为实例属性):
class A: def __init__(self, char, num): self.char = char # 保存第一个构造参数 self.num = num # 保存第二个构造参数
基础循环实现
用普通的for循环统计:
my_list = ['foo', 'bar', A('m',2), 'asdf', A('c', 2)] desired_char = 'm' count = 0 for item in my_list: # 先判断是不是A的实例,再检查char属性 if isinstance(item, A) and item.char == desired_char: count += 1 print(count) # 输出:1,和你的预期一致
更简便的写法
如果你想更简洁,可以用生成器表达式配合sum,一行搞定:
count = sum(1 for item in my_list if isinstance(item, A) and item.char == desired_char)
这里的生成器会遍历列表,每遇到符合条件的元素就生成一个1,sum把这些1加起来就是总数。
如果你的Python版本是3.10+,还可以用更直观的match-case语法:
count = 0 for item in my_list: match item: case A(char=desired_char): # 直接匹配A实例且char属性等于目标值 count += 1 case _: # 其他情况跳过 pass
额外提醒
如果你的类A没有把构造参数存为实例属性,那得先修改类A——构造函数执行完后,参数会被销毁,外部根本拿不到这些值,所以一定要把需要访问的参数存在self的属性里。
内容的提问来源于stack exchange,提问作者boomsois2492
相关产品推荐
相关产品推荐

