【问题标题】:python Counter for a list of lists?列表列表的python计数器?
【发布时间】:2017-10-21 03:29:15
【问题描述】:

我想通过调用 collections.Counter 来计算列表中项目的频率。诀窍是我的列表本身包含列表:

给定:

[[1,"a"], [2,"b"], [3,"c"], [1,"a"], [1,"a"]

生产:

{
  ([1,"a"], 3),
  ([2,"b"], 1),
  ([3,"c"], 1)
}

当我使用我的列表实例化 Counter 时,我得到 TypeError: unhashable type: 'list'.

Counter 可以做我想做的事吗?是否有其他(相当有效的)方法可以做到这一点?

【问题讨论】:

  • 列表是可变的。考虑一下这些数据和计数的瞬态性。如果每个包含列表都是一条记录,请认真考虑 GWW 和 James 关于将包含列表转换为元组的建议。

标签: python list count


【解决方案1】:

Counter 返回一个哈希表。为此,密钥(被计算的内容)必须是可散列的。不幸的是,列表不可散列,这就是您看到错误的原因。

一种解决方法是将每个内部列表转换为tuple

from collections import Counter

x = [[1,"a"], [2,"b"], [3,"c"], [1,"a"], [1,"a"]]
Counter(tuple(item) for item in x)
# returns:
Counter({(1, 'a'): 3, (2, 'b'): 1, (3, 'c'): 1})

【讨论】:

    【解决方案2】:

    通常只有不可变类型是可散列的。您可以使用map 将列表转换为元组。

    from collections import Counter
    x = [[1,"a"], [2,"b"], [3,"c"], [1,"a"], [1,"a"]
    print(Counter(map(tuple, x)))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-14
      • 2017-03-08
      • 2015-07-12
      • 1970-01-01
      • 1970-01-01
      • 2015-04-08
      • 1970-01-01
      相关资源
      最近更新 更多