0
嗨在Python我有一个namedtuple,因为我想存储在同一个对象的几个值。复杂的一套nameduple查找
A = namedtuple("A", "key1 key2 key3")
我存储这些A在其中持有一组()
class ARegistry(object):
def __init__(self):
self._register = set()
def register(self, value1, value2, value3):
self._register.add(A(key1=value1, key2=value2, key3=value3)
def __getitem__(self, value1):
return next((x for x in self._registry if x.key1 == value1), None)
def get_by_key2(self, value):
return next((x for x in self._registry if x.key2 == value), None)
def get_by_key3(self, value):
return next((x for x in self._registry if x.key3 == value), None)
这样,我可以很容易地检索由key1的那些namedtuples,我需要在大多数情况下(80%)的注册类,同时也对KEY2或KEY3(其他20%):
myobj1 = a_register["foo"] # Search on key1
myobj2 = a_register.get_by_key2("bar") # Search on key2
myobj3 = a_register.get_by_key3("bar") # Search on key3
问题:
现在,我从关于集合的文档中读到,集合中的查找是否具有复杂性O(1)。但是,如果我像上面的例子中那样存储名为tuple的数据,这仍然是真的吗?或者这样的构造增加了我的注册表中对象的查找时间,并且是另一种能够通过多个键首选,按时间查找值的另一种方法。
您不使用'O(1)'查找集所有。你在这里的所有东西都是'O(n)',因为你正在迭代整个集合而不是进行会员资格检查。如果你想'O(1)',你应该使用一个字典,每个实例有3个条目,每个键的值为实例。 – IanAuld