计算列表列表中某个类的实例的出现次数

时间:2017-11-01 20:16:13

标签: python python-3.x

我有列表列表,我想在其中计算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()实例的数量?

1 个答案:

答案 0 :(得分:1)

您可以使用isinstance()

您可以查看elementisinstance()的分类。

以下是一个例子:

>>> 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 comprehensionisinstance() function应用于element中的每个list。然后我们使用sum上的generator作为True评估到1False0,这样我们就会得到count }}

作为旁注,虽然我说命名list 'array'不是一个好习惯,但实际上更确切地说是'list',因为这会阻止你能够使用list() function!更好的可能是lstl:)