集列表和默认字典

时间:2018-09-09 18:05:42

标签: python python-3.x

我对Python还是很陌生,所以如果这是一个简单的问题,我深表歉意。但是,我将感谢您的帮助。当我通过函数时,我得到的是无法散列的类型:“ set”,我不确定为什么。

我有一组数据的数据:

listsets = ({'fruit', 'margarine', 'soups', 'bread'}, {'coffee', 'fruit', 'yogurt'},…

我的目标是在每个集合中找到配对项的数量,如下所示:

('fruit', 'bread'): 24, ('fruit', 'margarine'): 78, …  

我正在使用组合函数和默认字典,如下所示:

counts = defaultdict(int)  
def paircounts (counts, list):  
    for a, b in combinations(list,2):  
        counts[(a, b)] +=1
        counts[(b, a)] +=1

paircounts(counts, listsets)
  

错误-无法散列的类型:“设置”

我还尝试在我的列表集(未设置)上使用Frozenset并出现了内存错误(因此我认为我不应该在分配任务时使用它)

注意:在我得到一串文本之前,我先将其转换为字符串列表,然后再转换为集合列表(即我的列表集)。

我也尝试过转换为元组,这也给了我一个内存错误。我不确定是否可能将其转换为错误。我做了以下工作:[tuple(elem) for elem in listsets]

1 个答案:

答案 0 :(得分:0)

您可以使用Counter更有效地解决问题:

from collections import Counter
from itertools import combinations, chain
Counter(chain.from_iterable(combinations(l,2) for l in listsets))
#Counter({('soups', 'fruit'): 1, ('soups', 'bread'): 1, 
#         ('soups', 'margarine'): 1, ('fruit', 'bread'): 1, 
#         ('fruit', 'margarine'): 1, ('bread', 'margarine'): 1, 
#         ('yogurt', 'fruit'): 1, ('yogurt', 'coffee'): 1, ('fruit', 'coffee'): 1})

出于任何实际目的,Counter的行为类似于dict