我有列表列表,我想在其中计算B()和C()实例的数量,并且正在寻找合适的方法来执行此操作。使用collections.Counter()和.count()函数导致奇怪的结果,我怀疑我不完全理解列表的列表如何在python中工作,或者类实例列表如何在python中工作。
这是列表清单:
lst = [[B() for w in range(x)] for h in range(y)]
与
class A():
def __init__(self, name):
self.name = name
class B(A):
def __init__(self, name = "B"):
A.__init__(self, name)
def update(self):
if random.random() < 0.05:
return C()
else: return self
class C(A):
def __init__(self, name = "C"):
A.__init__(self, name)
并且,我使用以下代码将B()
中的lst
个实例随机更改为C()
个实例:
for row in range(y):
for column in range(x):
lst[row][column] = lst[row][column].update()
如何计算列表中B()和C()实例的数量?
答案 0 :(得分:1)
isinstance()
您可以查看element
与isinstance()
的分类。
以下是一个例子:
>>> a = C()
>>> isinstance(a, C)
True
因此,如果你有list
,你可以这样做:
occurrences_of_B = sum(isinstance(i, B) for r in list for i in r)
occurrences_of_C = sum(isinstance(i, C) for r in list for i in r)
您可以获得B()
和C()
classes
的出现次数。
基本上,我们使用generator comprehension
将isinstance()
function
应用于element
中的每个list
。然后我们使用sum
上的generator
作为True
评估到1
和False
到0
,这样我们就会得到count
}}
作为旁注,虽然我说命名list
'array'
不是一个好习惯,但实际上更确切地说是'list'
,因为这会阻止你能够使用list()
function
!更好的可能是lst
或l
。 :)