【问题标题】:How to loop each array for Counter function inside a list using Python?如何使用 Python 在列表中为 Counter 函数循环每个数组?
【发布时间】:2015-08-22 12:38:01
【问题描述】:

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

谁能帮帮我?

【问题讨论】:

  • array() 是做什么的?
  • “它返回错误”:那个错误是什么?请发布完整的回溯。
  • 如果我忽略array,逻辑很简单:[Counter(x)[0] for x in list(chain(*a))]
  • @AbhiP 不过这会给出一个平面列表。
  • 回溯(最近一次调用最后):文件“”,第 1 行,在 [Counter(d) for d in x] 文件“C:\Python27\lib \collections.py",第 450 行,在 init self.update(iterable, **kwds) 文件“C:\Python27\lib\collections.py”,第 532 行,在更新 self[elem ] = self_get(elem, 0) + 1 TypeError: unhashable type: 'numpy.ndarray'

标签: python arrays loops counter


【解决方案1】:

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]

【讨论】:

    猜你喜欢
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2018-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    相关资源
    最近更新 更多