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

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

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

В статье было предложено предложение:

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

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

Edit:

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

EDIT 0

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

>>> 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
>>>

Ответ 3

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

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

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

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

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

Ответ 4

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

то есть.

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

Ответ 5

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

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

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

Ответ 6

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

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

Ответ 7

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

Ответ 8

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

Ответ 9

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

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

    funnels = defaultdict(int)
    funnels[('hovered_text2', 'clicked_image3')] += 1

Ответ 10

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()

Ответ 11

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

Скажем, вы ищете лучшую комбинацию гиперпараметров для 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

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