Python: перетворення списку на словник з індексами як значеннями


83

Я намагаюся перетворити такий список:

list = ['A','B','C']

До такого словника, як:

dict = {'A':0, 'B':1, 'C':2}

Я пробував відповіді з інших постів, жоден з яких не працює для мене. Зараз у мене такий код:

{list[i]: i for i in range(len(list))}

Що дає мені цю помилку:

unhashable type: 'list'

Будь-яка допомога дуже вдячна. Дякую.


ваш код працює для мене.
Даніель

3
1. Не використовуйте listяк назву змінної 2. Використовуйте, enumerateяк показано{j:i for i,j in enumerate(l)}
Бхаргав Рао

1
У вас є помилка в коді, яку ви нам не показували. Елементи list, ймовірно, є списками, хоча ви могли б допустити й інші помилки, наприклад, list: iзамість написання list[i]: i.
user2357112 підтримує Моніку

@ user2357112 Я відредагував допис. Ви маєте рацію, що має велике значення.
ahajib

Дивно, що ніхто не помітив, що, якщо є дублікати елементів
EXODIA

Відповіді:


125

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

>>> lst = ['A','B','C']
>>> {k: v for v, k in enumerate(lst)}
{'A': 0, 'C': 2, 'B': 1}

Ох, і ніколи не називайте змінну вбудованою або типом.


16

Використовуйте вбудовані функції dict і zip:

>>> lst = ['A','B','C']
>>> dict(zip(lst,range(len(lst))))

10

dictКонструктор Python має можливість перетворити список tupleна dict, з ключем як першим елементом кортежу, а значення як другим елементом кортежу. Для досягнення цього ви можете використовувати вбудовану функцію, enumerateвихід tupleякої (index, value).

Однак вимога запитання прямо протилежна, тобто tupleповинна бути (value, index). Отже, для цього потрібен додатковий крок, щоб змінити елементи кортежу перед переходом до конструктора dict. Для цього кроку ми можемо використовувати вбудований reversedі застосовувати його до кожного елементу списку за допомогоюmap

>>> lst = ['A', 'B', 'C']
>>> dict(map(reversed, enumerate(lst)))
>>> {'A': 0, 'C': 2, 'B': 1}

Здається, ця версія займає більше часу, ніж інші запропоновані рішення
Leland Hepworth,

3

Не використовуйте listяк ім’я змінної, оскільки воно зарезервовано Python. Ви також можете скористатися enumerate.

your_list = ['A', 'B', 'C']
dict = {key: i for i, key in enumerate(your_list)}

1
чому ви не використовуєте елемент вашого цикла for-loop?
Даніель

Бо не треба. Я все-таки його змінив.
gr1zzly be4r

0

Ви повинні перетворити непридатний для перегляду список у кортеж:

dct = {tuple(key): idx for idx, key in enumerate(lst)}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.