【问题标题】:Create co-occurrence matrix from dictionary key, value(s) in Python从 Python 中的字典键、值创建共现矩阵
【发布时间】:2020-03-25 15:31:49
【问题描述】:

我正在尝试从具有重叠值的唯一键字典中创建一个共现矩阵(在 Python 3 中)。这是我的数据结构:

keys = ['A','B','C','D']
vals = [[1,2],1,[1,3],2]

dict = {'A':[1,2], 'B':1, 'C':[1,3], 'D':2]}

如何创建矩阵来计算表单中每个键的值出现次数:?

   1.  2.  3. 
A. 1   1   0 
B. 1   0   0 
C. 1   0   1 
D. 0   1   0 

有人建议我使用defaultdict,但我不确定如何实现它。 谢谢!

【问题讨论】:

  • 如果是vals = [[1,2],1,[1,2],4],结果会怎样?注意这里没有3
  • 1. 2. 3. 4. A. 1 1 0 0 B. 1 0 0 0 C. 1 1. 0. 0. D. 0 0 0. 1
  • 所以 3 将被包括在内,即使它从原始数据中丢失。请注意,@Dani 的其他出色答案并未涵盖这一点。这也强调了需要一个好的通用示例!

标签: python matrix counter defaultdict find-occurrences


【解决方案1】:

你可以这样做:

d = {'A': [1, 2], 'B': [1], 'C': [1, 3], 'D': [2]}

values = sorted(set(e for v in d.values() for e in v))

result = {k : [1 if value in v else 0 for value in values] for k, v in d.items()}

print(result)

输出

{'A': [1, 1, 0], 'B': [1, 0, 0], 'C': [1, 0, 1], 'D': [0, 1, 0]}

如果有很多值,您可以使用集合进行包含测试,如下所示:

d = {'A': [1, 2], 'B': [1], 'C': [1, 3], 'D': [2]}
d = { k : set(v) for k, v in d.items() }

@Ev 建议的更简洁的方式。 Kounis 是这样做的:

result = {k : [int(value in v) for value in values] for k, v in d.items()}

最后,如果您对列表数据结构的列表(即矩阵)感兴趣,您可以将结果的值放入列表中:

print(list(result.values()))

输出

[[1, 1, 0], [1, 0, 0], [1, 0, 1], [0, 1, 0]]

【讨论】:

  • 你也可以[int(value in v) for value in values]
【解决方案2】:

假设:

  • 原始 dict 的值中可能存在不应跳过的空白,并且
  • 您只对最小值和最大值定义的范围感兴趣

你可以这样做:

d = {'A':[1,2], 'B':[1], 'C':[1,3], 'D':[2]}

values_flat = {v for sub in d.values() for v in sub}
max_value = max(values_flat)
min_value = min(values_flat)

result = {k : [int(i in v) for i in range(min_value , max_value +1)] for k, v in d.items()}

print(result)  # {'A': [1, 1, 0], 'B': [1, 0, 0], 'C': [1, 0, 1], 'D': [0, 1, 0]}

请注意,我冒昧地重新定义并重命名了您原来的 dict。现在所有的值都是列表。一致的数据是必不可少的,因此如果您对输入有任何控制权,请确保首先对其进行清理。另请注意,dict 是一个错误的变量名称,因为它隐藏了 Python 内置函数。

【讨论】:

    猜你喜欢
    • 2012-08-14
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    相关资源
    最近更新 更多