Python 有没有办法在O(1)时间内使用其中一个键获取值

Python 有没有办法在O(1)时间内使用其中一个键获取值,python,dictionary,data-modeling,Python,Dictionary,Data Modeling,我正在为一个应用程序建模数据,并决定选择dictionary作为我的数据结构。但是数据中的每一行都有多个键。因此,我创建了一个字典,每行映射多个键,类似于: >>> multiKeyDict = {} >>> multiKeyDict[('key1','key2','key3')] = 'value1' >>> multiKeyDict.get(('key1','key2','key3')) 'value1' 现在我必须在O(1)时间内用k

我正在为一个应用程序建模数据,并决定选择dictionary作为我的数据结构。但是数据中的每一行都有多个键。因此,我创建了一个字典,每行映射多个键,类似于:

>>> multiKeyDict = {}
>>> multiKeyDict[('key1','key2','key3')] = 'value1'
>>> multiKeyDict.get(('key1','key2','key3'))
'value1'
现在我必须在O(1)时间内用
key1
检索所有值。根据我的研究,我知道我可以做到:

  • 使用包完成作业,但不确定是否为O(1)
  • 按此处建议搜索密钥:

我也愿意使用更好的数据结构,而不是使用字典

您没有多个键。就Python字典而言,只有一个键,一个元组对象。除了O(N)线性时间外,您不能在任何地方搜索元组的成分

如果密钥是唯一的,只需分别添加每个密钥:

multiKeyDict['key1'] = multiKeyDict['key2'] = multiKeyDict['key3'] = 'value1'
现在有3个键,它们都引用一个值。这里不复制值对象,只复制对它的引用

您找到的
multi_key_dict
包使用中间映射将给定的组成键映射到复合键,然后复合键映射到值。这也为您提供了O(1)搜索,具有相同的限制,即每个组成键必须是唯一的

如果您的键不是唯一的,则需要将每个键映射到另一个容器,然后该容器保存这些值,例如集合:

for key in ('key1', 'key2', 'key3):
    multiKeyDict.setdefault(key, set()).add(value)
现在,查找一个键将为您提供该键引用的所有值的集合


如果您也需要能够组合关键点,则可以使用这些组合添加其他引用。键值配对相对便宜,都是引用。键和值对象本身不重复。

另一种可能是建立一个索引,以列出共享键组件的行对象。如果共享任何特定键值的行数很小,这将非常有效。(假设行对象的键被访问为
row.key1
row.key2
等,这不是一个非常相关的细节)。未测试代码:

index = {}
for row in rows:
    index.setdefault( row.key1, []).append(row)
    index.setdefault( row.key2, []).append(row)
    index.setdefault( row.key3, []).append(row)
然后查找匹配的行,例如,
key2
key3

candidates = index[ key2] 
if len( index[key3]) < len(candidates): 
    candidates = index[key3] # use key3 if it offers a better distribution
results = []
for cand in candidates:
    if cand.key2 == key2 and cand.key3 == key3: # full test is necessary!
        results.append( cand)
候选者=索引[key2]
如果len(索引[key3])
不,没有。您提到的包将一系列键映射到相同的值。如果我正确理解你的问题,你想要更多某种层次结构?为什么不制作两本字典?一个像
{'key1':['value1','value2']}
和一个像
{'value1':['key1','key2']}
谢谢@MartijnPieters@Chris\u Rands,因为值是逗号分隔的长字符串
key1
可能有多个值,我不想将值映射到每个键,因为它不会随时间缩放data@PseudoAj:那么您就没有适合哈希表的数据,只能对该数据结构进行线性搜索。这同样适用于您找到的
multi_-key_-dict
包。@PseudoAj“不会随数据缩放”是什么意思@PseudoAj:那么,如果有多个值,您希望在搜索
key1
时找到什么?如果每个键有K个值,则不能进行O(1)搜索。@PseudoAj:如果有数百万条记录具有复杂的关系,那么听起来您需要一个关系数据库。让它担心高效的数据结构。