Подтвердить что ты не робот

Быстро повторяя список кортежей

Интересно, есть ли более быстрый и менее трудоемкий способ перебора списка кортежей, нахождение правильного совпадения. Что я делаю:

# this is a very long list.
my_list = [ (old1, new1), (old2, new2), (old3, new3), ... (oldN, newN)]

# go through entire list and look for match
for j in my_list:
    if j[0] == VALUE:
        PAIR_FOUND = True
        MATCHING_VALUE = j[1]
        break

этот код может занять довольно много времени, в зависимости от количества элементов в списке. Я уверен, что лучший способ сделать это.

4b9b3361

Ответ 1

Предполагая, что использование большего количества памяти не является проблемой, и если первый элемент вашего кортежа hashable, вы можете создать dict из вашего списка кортежей, а затем поиск значения так же просто, как поиск ключа из dict. Что-то вроде:

dct = dict(tuples)
val = dct.get(key) # None if item not found else the corresponding value

EDIT. Чтобы создать обратное сопоставление, используйте что-то вроде:

revDct = dict((val, key) for (key, val) in tuples)

Ответ 2

Я думаю, что вы можете использовать

for j,k in my_list:
  [ ... stuff ... ]

Ответ 3

Код можно очистить, но если вы используете список для хранения ваших кортежей, любой такой поиск будет O (N).

Если скорость поиска важна, вы должны использовать dict для хранения ваших кортежей. Ключ должен быть 0-м элементом ваших кортежей, так как это то, что вы ищете. Вы можете легко создать dict из своего списка:

my_dict = dict(my_list)

Затем (VALUE, my_dict[VALUE]) даст вам ваш соответствующий кортеж (предполагая, что VALUE существует).

Ответ 4

Вопрос мертв, но все еще зная, что еще один способ не болит:

my_list = [ (old1, new1), (old2, new2), (old3, new3), ... (oldN, newN)]

for first,*args in my_list:
    if first == Value:
        PAIR_FOUND = True
        MATCHING_VALUE = args
        break

Ответ 5

Интересно, подходит ли метод ниже.

Вы можете использовать defaultdict.

>>> from collections import defaultdict
>>> s = [('red',1), ('blue',2), ('red',3), ('blue',4), ('red',1), ('blue',4)]
>>> d = defaultdict(list)
>>> for k, v in s:
       d[k].append(v)    
>>> sorted(d.items())
[('blue', [2, 4, 4]), ('red', [1, 3, 1])]