如何使用 Python 循环列表中计数器函数的每个数组?

How to loop each array for Counter function inside a list using Python?

我想使用计数器函数来计算列表中每个数组的值 0 的出现次数。

from collections import Counter
[Counter(x) for x in a]
[Counter(x)[0] for x in a]

使用上面的代码,它只适用于像这样的例子:

a = [array([-2, 0, 0]), array([-2, -1, 1])]

当它应用于下面有多个数组的代码时,它会引发类型错误:

a = [[array([-2, 0, 0]), array([-2, -1, 1])], [array([3, -1]), array([1, -2])]]

预期输出:

[[2, 0], [0, 0]]

谁能帮帮我?

Counter 不能神奇地降低你的列表,只能独立计算每个数组中的元素。它将始终根据您传递给它的直接迭代器进行操作。在您的第一个示例中,您迭代列表,然后使用每个元素创建一个新的 Counter;由于您有 array 个对象的平面列表,因此您不断将 array 个对象传递给调用。但是,在您的第二个示例中,您有一个列表列表(然后包含数组对象)。所以当你做和以前一样的事情时,你会尝试从这些列表中创建一个计数器。所以计数器试图做的是计算某个数组对象出现在该列表中的频率。但是由于数组对象不可散列,它无法识别它们并且您会收到该错误。但这不是您想要使用的逻辑。

相反,您想遍历所有列表,并在遇到数组时从中创建一个计数器:

def convert (obj):
    if isinstance(obj, list):
        return list(map(convert, obj))
    else:
        return Counter(obj)[0]
>>> a = [[array([-2, 0, 0]), array([-2, -1, 1])], [array([3, -1]), array([1, -2])]]
>>> convert(a)
[[2, 0], [0, 0]]
>>> b = [array([-2, 0, 0]), array([-2, -1, 1])]
>>> convert(b)
[2, 0]