2017-10-21 49 views
1

我想通過調用collections.Counter來計算列表中項目的頻率。訣竅是,我的名單本身就包含列表:python計數器列表的列表?

考慮:

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

農產品:

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

當我用我的名單實例計數器,我得到TypeError: unhashable type: 'list'.

可以反做我想要的是?有沒有其他(合理有效的)方法來做到這一點?

+0

列表是可變的。考慮這個數據和計數是多麼短暫。如果每個包含的列表都是一個記錄,那麼認真考慮GWW和James所建議的關於將包含的列表轉換爲元組的建議。 – Rookie

回答

2

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)))