senderle прав (я проголосовал), но я хочу уточнить (и больше, чем просто в комментарии).
Поиск в словаре O (1) и действительно быстрый (в основном ваш ключ превращается вхеш, который обращается к конкретному месту в памяти, чтобы немедленно получить ваши данные).
В отличие от этого, поиск значения путем поиска в массиве медленен, по крайней мере, O (N), поэтому для больших массивов потребуется больше времени, чтобы найти правильное значение.(Например, вы должны просеять все N ключей, найти правильный и затем вернуть кортеж.)
Так что, если ваши ключи уникальны, как вы говорите, имеет смысл просто создать большой словарьон индексируется на основе каждого ключа, который вы можете использовать для поиска.Конечно, вам придется представлять каждый кортеж из m элементов (m = 3 в вашем случае), m раз в словаре, в то время как с одним массивом его нужно было представить только один раз в массиве.
Таким образом, выхотите определить класс Collection
class Collection(object):
def __init__(self, collection):
self.collection_dict = dict()
for tup in collection:
for i, v in enumerate(tup):
self.collection_dict[(i, v)] = tup
def lookup_by_first_element(self, e):
return self.collection_dict.get((0, e), None)
def lookup_by_second_element(self, e):
return self.collection_dict.get((1, e), None)
def lookup_by_third_element(self, e):
return self.collection_dict.get((2, e), None)
collection = [(1, 200, 9),
(2, 300, 8),
(3, 400, 7)]
c = Collection(collection)
Внутренний c.collection_dict
:
{(0, 1): (1, 200, 9),
(0, 2): (2, 300, 8),
(0, 3): (3, 400, 7),
(1, 200): (1, 200, 9),
(1, 300): (2, 300, 8),
(1, 400): (3, 400, 7),
(2, 7): (3, 400, 7),
(2, 8): (2, 300, 8),
(2, 9): (1, 200, 9)}
И ваши поиски работают так, как вы просили
>>> c.lookup_by_first_element(1) == (1, 200, 9)
True
>>> c.lookup_by_second_element(300) == (2, 300, 8)
True
>>> c.lookup_by_third_element(250) is None
True