У меня есть этот список:
address_table3 = [(1, ['21 South Main']), (2, ['1560 West St']), (3, ['1900 Broadway'])]
Я хочу преобразовать его в словарь с адресом в качестве ключа и целым числом в качестве значения.
При попытке конвертировать получаю ошибку:
TypeError: unhashable type: 'list'
Я пробовал понимание диктовок и другие идеи:
{k: v for k, v in zip(address_table3.values(), address_table3.keys())}
но ничего не работает.
{k:v for v,[k] in address_table3}
— скобки вокруг k
в присвоении переменным цикла приводят к распаковке ваших списков в их содержимое. (Я предполагаю, что в списках всегда есть ровно один элемент.)
Словари не могут использовать списки в качестве ключей.
Конструктор dict
возьмет список кортежей, где первый элемент в каждом кортеже является ключом, а второй — значением. Ваши точно от этого отстали. Кроме того, строка, которую вы хотите использовать в качестве ключа, находится в списке, который нельзя использовать в качестве ключа словаря и который является источником вашей ошибки. Итак, вы можете написать выражение-генератор, чтобы переключать их, извлекать действительный ключ из его списка и передавать его в dict
.
dict((t[1][0], t[0]) for t in address_table3)
Или распакуйте кортеж на отдельные переменные и сделайте то же самое:
dict((k[0], v) for (v, k) in address_table3)
Если существует вероятность того, что в списке, который вы используете в качестве ключа, может быть более одного элемента, вы можете использовать str.join
, чтобы объединить их все в одну строку. В приведенном здесь примере отдельные элементы разделяются символами новой строки, но вы можете использовать пробелы или любые другие символы.
dict(('\n'.join(k), v) for (v, k) in address_table3)
address_table3
, будучи списком, не имеет ключей.