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

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

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

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

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

Править:

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

64
задан qtmfld 16 May 2018 в 08:36
поделиться

6 ответов

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

.
95
ответ дан 24 November 2019 в 15:46
поделиться

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

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

.
2
ответ дан 24 November 2019 в 15:46
поделиться

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

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

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

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

    def func(a1, b1):
     if (a1,b1) в кэше: возвращает кэш[(a1,b1))
     ...
    
8
ответ дан 24 November 2019 в 15:46
поделиться

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

т.е.

seen = {}
seen[('abc', 'lax')] = 1
seen[('xyz', 'nyc')] = 1
5
ответ дан 24 November 2019 в 15:46
поделиться
salaries = {}
salaries[('John', 'Smith')] = 10000.0
salaries[('John', 'Parker')] = 99999.0

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

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

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
>>>
26
ответ дан 24 November 2019 в 15:46
поделиться
a[("John", "Doe")] = "123 Fake Street"
1
ответ дан 24 November 2019 в 15:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: