Я изучал различие между списками и кортежами (в Python). Очевидный - то, что кортежи неизменны (значения не могут быть изменены после начального присвоения), в то время как списки изменяемы.
Предложение в статье получило меня:
Только неизменные элементы могут использоваться в качестве ключей словаря, и следовательно только кортежи и не списки могут использоваться в качестве ключей.
Мне нелегко думать о ситуации, где я хотел бы использовать кортеж в качестве ключа словаря. Можно ли обеспечить проблему в качестве примера, где это было бы естественным, эффективным, изящным, или очевидным решением?
Править:
Спасибо за Ваши примеры. До сих пор я беру это, очень важное приложение является кэшированием значений функции.
Классический пример: Вы хотите сохранить значение точки как кортеж (x, y)
. Полагаю, в случае сортировки, возможно, стоит использовать кортеж. Например, предположим, что ключ словаря представляет собой поле сортировки (очевидно, что по умолчанию будет поле сортировки, чтобы ключ не был None
). Если вам нужно несколько полей сортировки, например, случай сортировки по фамилии, то имя, не будет ли использование кортежа, так как ключ словаря будет хорошей идеей?
Конечно, такая идея может иметь ограниченное применение, но это не значит, что она совершенно бесполезна.
. Я использую кортежи в качестве ключа dict
, например,
Я использую их, когда мне нужно создать уникальный ключ из нескольких значений, например.
на основе first_name
, last_name
ключ может быть ключом = '%s_%s'%(first_name, last_name)
, но лучше ключом = (first_name, last_name), потому что
ключ = '%s_%s' %(first_name, last_name)
неправильный и может не дать уникальных ключей для всех значений first_name
и last_name
e. g. когда значения содержат _
Кэширование результатов функции
def func(a1, b1):
if (a1,b1) в кэше: возвращает кэш[(a1,b1))
...
Я использовал кортежи в качестве ключей словаря в приложении, которое сравнивает сетевые устройства по географическому расположению. Так как устройства имеют одинаковые имена для каждого местоположения, это обеспечивает естественный способ узнать, было ли уже обнаружено устройство, подходящее для этой пары при обработке кратных цифр.
т.е.
seen = {}
seen[('abc', 'lax')] = 1
seen[('xyz', 'nyc')] = 1
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
>>>