创建一个“集合字典”

18

我需要高效地将数据存储在类似于“字典集合”的东西中,比如一个包含多个(唯一)值与每个唯一键匹配的字典。我的数据来源是一个(不太好的)结构化XML。

我的想法是: 我将查看多个元素并查找键。如果该键不存在,则将其添加到字典中;如果已存在,则只需在相应的键中添加一个新值。

结果将类似于:

{
 'key1': {'1484', '1487', 1488', ...}
 'key2': {'1485', '1486', '1489', ...}
 'key3': {'1490', '1491', '1492', ...}
 ...
}

我需要能够动态添加新的键。

我需要将唯一的值推入每个集合中。

我需要能够遍历整个字典。

我不确定这是否可行,但如果有人能指导我正确的方向,我将不胜感激。


3
你为解决这个问题做了什么? - depperm
3个回答

16

我不打算对此进行基准测试,但根据我的经验,本地字典更快。

store = {}
for key, value in yoursource:
    try:
        store[key].add(value)
    except KeyError:
        store[key] = {value}

清洁、快速的解决方案 - Charly Empereur-mot

12
from collections import defaultdict
mydict = defaultdict(set)
mydict["key1"] |= {'1484', '1487', '1488'}

迭代就像普通字典一样。


2
这样做是行不通的,因为您正在尝试将一个集合添加为另一个集合的成员。但是集合是不可哈希的。您可能想要使用 |= 运算符。或者只添加一个数字词。 - Paul Panzer
@Paul:字典只需要键是可哈希的。 - martineau
1
@martineau 就像集合的元素一样。这里的问题与封闭字典无关,而是答案试图将一个集合塞入到字典中作为值的集合中。 - Paul Panzer
@PaulPanzer,是的,我想要 |=。add 当然是针对单个元素的。 - Ohjeah

3
使用 dict.setdefault() 创建键(如果它不存在),并用一个空的 set 进行初始化:
store = {}
for key, value in yoursource:
    store.setdefault(key, set()).add(value)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接