多个字典(默认字典)的不同组合中值的交集

Intersection of values in different combinations of multiple dictionaries (default dicts)

我正在尝试从 python 中的 dataframe 构建一个 table,它显示两个特定类别之间的单词的常见频率总数。 为了做到这一点,我首先构建了一个 default dict,其中包含每个类别 key 以及属于该类别的单词列表 value

现在,我需要为两个 categories 的每个组合构建一个 table 来展示最终期望结果 table 的共性,例如:

  A B C
A 10 2 1
B 2 5 2
C 1 2 3

我正在使用的示例数据如下:

Cat Item
A dog
A cat
A bear
A fish
A monkey
A tiger
A lion
A rabbit
A horse
A turtle
B dog
B cat
B flower
B plant
B bush
C dog
C flower
C plant

我使用的工作代码是:

import pandas as pd
import numpy as np
from collections import defaultdict


inFile = '\path\to\infile.csv'

data = pd.read_csv(inFile, sep='\t')
dicts = defaultdict(list)

for i, j in zip(data['Cat'],data['Item']):
    dicts[i].append(j)


for k,v in dicts.iteritems():
    set1 = set(v)
    set2 = set(v)
    for k in set1.intersection(set2):
        print k,v

在运行之后:结果default dict(在intersection之前)如下

{'A':['dog','cat','bear','fish','monkey','tiger','lion','rabbit','horse','turtle'],'B':['dog','cat','flower','plant','bush'],'C':['dog','flower','plant']}

试图研究这个问题,我遇到了 following solution:, 这是朝着正确方向迈出的一步,因为它根据多个 dics 中的键对值进行计数和分组,但是它没有考虑每个键组合之间的值的并集 字典的。

我也看过一些查找匹配键或值的解决方案,但其中大多数,例如 HERE,只处理两个字典的实例,而不是多个字典的实例。

因此,我仍然卡在如何计算和求和多个字典中每个键组合之间的公共元素总数。

我已经做了一个字典,你可以把它的数据格式化成table: 使用 & 运算符进行交集,这正是您所需要的:-

>>> dicts = {'A':['dog','cat','bear','fish','monkey','tiger','lion','rabbit','horse','turtle'],'B':['dog','cat','flower','plant','bush'],'C':['dog','flower','plant']}
>>> dicts.items()
[('A', ['dog', 'cat', 'bear', 'fish', 'monkey', 'tiger', 'lion', 'rabbit', 'horse', 'turtle']), ('C', ['dog', 'flower', 'plant']), ('B', ['dog', 'cat', 'flower', 'plant', 'bush'])]
>>> dicts = {'A':['dog','cat','bear','fish','monkey','tiger','lion','rabbit','horse','turtle'],'B':['dog','cat','flower','plant','bush'],'C':['dog','flower','plant']}
>>> items = sorted(dicts.items())
>>> res = {}
>>> for i in range(len(items)) :
...     for j in range(i,len(items)) :
...             res[(items[i][0],items[j][0])] = len(set(items[i][1]) & set(items[j][1]))
...             res[(items[j][0],items[i][0])] = res[(items[i][0],items[j][0])]
...
>>> res
{('B', 'C'): 3, ('A', 'A'): 10, ('B', 'B'): 5, ('B', 'A'): 2, ('C', 'A'): 1, ('C', 'B'): 3, ('C', 'C'): 3, ('A', 'B'): 2, ('A', 'C'): 1}
>>>