В каком случае я буду использовать Кортеж в качестве ключа словаря?


Я изучал разницу между списками и кортежами (в Python). Очевидным является то, что кортежи неизменяемы (значения не могут быть изменены после первоначального назначения), а списки изменяемы.

предложение в статье меня:

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

Мне трудно думать о ситуации, где я хотелось бы использовать Кортеж в качестве ключа словаря. Можете ли вы привести пример проблемы, где это было бы естественным, эффективным, элегантным или очевидным решением?

Edit:

Спасибо за ваши примеры. До сих пор я считаю, что очень важным приложением является кэширование значений функций.

11   52  

11 ответов:

классический пример: вы хотите сохранить значение точки в виде кортежа (x, y)

salaries = {}
salaries[('John', 'Smith')] = 10000.0
salaries[('John', 'Parker')] = 99999.0

редактировать 1 Конечно, вы можете сделать salaries['John Smith'] = whatever, но тогда вам придется сделать дополнительную работу, чтобы разделить ключ на имя и фамилию. А как же pointColor[(x, y, z)] = "red", здесь преимущество ключа кортежа более заметно.

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

изменить 0

By кстати, каждый элемент кортежа должен быть слишком hashable:

>>> d = {}
>>> t = (range(3), range(10, 13))
>>> d[t] = 11
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: list objects are unhashable
>>>

я использую кортеж много времени как dict ключ например

  • я использую их, когда мне нужно создать уникальный ключ из нескольких значений, например

    на основе first_name,last_name ключ может быть ключом = '%s_%s'%(first_name, last_name) но лучший способ-это key = (first_name, last_name), потому что

    1. это более читабельно, короче и меньше вычислений
    2. легче получить отдельные значения
    3. самое главное key = '%s_%s'%(first_name, last_name) - это неправильно и не может дать уникальные ключи для всех значений first_name и last_name например, когда значения содержат _
  • кэширование результатов функции

    def func(a1, b1):
        if (a1,b1) in cache: return cache[(a1,b1)]
        ...
    

я использовал кортежи как ключи словаря в приложении, которое сравнивает сетевые устройства по географическому положению. Поскольку устройства называются одинаково для каждого местоположения, это обеспечивает естественный способ узнать, было ли устройство, соответствующее этому сопряжению, замечено еще при обработке кратных.

т. е.

seen = {}
seen[('abc', 'lax')] = 1
seen[('xyz', 'nyc')] = 1

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

например: {(<x-coordinate>,<y-coordinate>): <indicating letter>}

здесь, если мы используем тег x-coordinate или y-coordinate отдельно мы бы не представляли эту точку зрения.

Я полагаю, что в случае сортировки, может быть заслуга в использовании кортежа. Например, предположим, что ключ словаря представляет собой Поле сортировки (очевидно, что было бы Поле сортировки по умолчанию, чтобы предотвратить ключ от None). Если вам нужно несколько полей сортировки, таких как сортировка по фамилии, а затем по имени, не было бы хорошей идеей использовать Кортеж в качестве ключа словаря?

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

вы можете использовать его для приблизительно постоянного поиска времени точки в пространстве поиска. Например, вы можете использовать его для задачи удовлетворения ограничений, где каждый Кортеж может содержать некоторые ограничения. Ограничение может иметь вид (v1.v2) где цвет(v1)!=цвет (v2) для окрашивания prob и т. д. Используя кортежи в качестве ключей словаря, вы сможете сказать в постоянное время, удовлетворяет ли перестановка ограничению или нет.

a[("John", "Doe")] = "123 Fake Street"

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

, подсчитывая, сколько людей нажали на image3 после наведения курсора на text2.

    funnels = defaultdict(int)
    funnels[('hovered_text2', 'clicked_image3')] += 1
def getHash(word):
    result={}
    for i in range(len(word)):
        if word[i] in result:
            result[word[i]]+=1
        else :
            result[word[i]]=1

    return tuple (sorted((result.items())))


def groupAnagrams(words):
    resultHash={}
    for i in range(len(words)):
        s=getHash(words[i].lower())
        #print s
        if s in resultHash :
            l=list(resultHash[s]) 
            l.append(words[i])
            resultHash[s] = l # list(resultHash[s]).append(words[i])  
        else :
            resultHash[s]=[words[i]] # Creating list 

    return resultHash.values()

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

допустим, вы ищете лучшую комбинацию гиперпараметров для learning_rate,regularization_factor и model_complexity.

тогда у вас может быть словарь на Python, где вы делаете другую комбинацию, которую эти hparams могут принимать как ключи и соответствующие им весовые матрицы из алгоритма обучения как значения

hparams_hist = {}
hparams_hist[(0.001, 0.7, 5)] = weight_matrix1
hparams_hist[(0.0001, 0.8, 2)] = weight_matrix2

эти весовые матрицы также необходимы для прогнозирования в реальном времени.