2011-04-06 75 views
1

的数据结构应满足以下目的:Python数据结构设计

  • 每个对象是与某些键 - 值对
  • 的键和值不是预先确定的独特的,并且可以包含任何的字符串值
  • 查询的对象应该是快速

实施例:

  • object_123({'stupid':True, 'foo':'bar', ...})
  • structure.get({'stupid':True, 'foo':'bar', ...})应该返回object_123

最理想这种结构与可通过标准库标准Python数据结构来实现。

你将如何实现这一点?

+0

@ahojnnes:作业? – phooji 2011-04-06 19:43:22

+0

@phooji:不,我想不出任何干净和良好的实施,并寻求专家的意见。 – 2011-04-06 19:47:17

+0

@ phooji:我也想知道,但他的其他问题似乎是合法的。 – 2011-04-06 19:48:35

回答

5

我能想到的最简单的解决方法是使用排序的元组键:无论是在一类或只是包装他们

def key(d): return tuple(sorted(d.items())) 

x = {} 
x[key({'stupid':True, 'foo':'bar', ...})] = object_123 

x.get(key({'stupid':True, 'foo':'bar', ...})) => object_123 

另一种办法是拿出自己的散列方案为您的钥匙(使用字典中的数字键),但取决于您的访问模式,这可能会更慢。

+0

+1:创建“冻结字典”的好方法。 – 2011-04-06 19:48:34

+0

哈!你击败了我 – inspectorG4dget 2011-04-06 19:48:44

+0

+1,尽管我的一部分人想知道是否有一种名为tuple的方法可能会有帮助... – ncoghlan 2011-04-07 08:20:34

0

我认为SQLite或者是你所需要的。它可能不能用标准的python结构来实现,但它可以通过标准库来实现。

0

object_123是一个字典,它看起来很像。你的structure似乎是一个标准的字典,如(('foo', 'bar'), ('stupid', True));换句话说,tuple(sorted(object_123.items())),以便它们始终按照定义的顺序列出。

定义的顺序的原因是因为dict.items()不保证以给定的顺序返回列表。如果您的字典密钥是(('foo', 'bar'), ('stupid', True)),那么您不希望仅因为您正在搜索(('stupid', True),('foo', 'bar'))而产生误报。对值进行排序可能是防止这种情况的最快方法。