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