如何使用Python在列表中为Counter函数循环每个数组?

时间:2015-06-08 06:28:53

标签: python arrays loops counter

我想使用计数器函数来计算列表中每个数组的值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])]

当它适用于下面有多个数组的代码时,它会引发一个TypeError:

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

预期产出:

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

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:4)

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]