Как вы можете выполнить итерацию по кортежу (str), а затем вернуть словарь, содержащий ключи (из кортежа) и индекс ключей в качестве значений?
Вход:
tup = ('A', 'A', 'B', 'B', 'A')
Вернуть словарь, который выглядит следующим образом:
{'A': [0, 1, 4], 'B': [2, 3]}
tup = ('A', 'A', 'B', 'B', 'A')
from collections import defaultdict
d = defaultdict(list)
for i,k in enumerate(tup):
d[k].append(i)
dict(d)
или с классическим словарем:
d = {}
for i,k in enumerate(tup):
if k in d:
d[k].append(i)
else:
d[k] = [i]
вывод: {'A': [0, 1, 4], 'B': [2, 3]}
Вы также можете использовать dict.setdefault
, хотя я нахожу это не очень явным, если вы не знакомы с методом setdefault
:
d = {}
for i,k in enumerate(tup):
d.setdefault(k, []).append(i)
@LancelotduLac, вы могли бы сделать что-то вроде for i,k in enumerate(tup): d.setdefault(k, []).append(i)
, но я нахожу это немного загадочным для чтения. я добавил комментарий
Вот несколько мысли о setdefault
против defaultdict
Простым подходом было бы присвоить пустой список каждому уникальному элементу в кортеже. Затем добавьте индекс каждого элемента в соответствующий список.
Вот мой код: -
Создание пустого словаря.
tup = ('A', 'A', 'B', 'B', 'A')
d = {}
Присвоение пустого списка в словаре каждому уникальному элементу кортежа.
for i in range(len(tup)):
d[tup[i]] = []
Добавление индекса каждого элемента кортежа в его соответствующий список в словаре
for j in range(len(tup)):
d[tup[j]].append(j)
Полный код: -
tup = ('A', 'A', 'B', 'B', 'A')
d = {}
for i in range(len(tup)):
d[tup[i]] = []
for j in range(len(tup)):
d[tup[j]].append(j)
print(d)
Взгляните на мой ответ, вы можете выполнить оба действия в одном цикле.
Ваш второй пример очень ясен с точки зрения того, что вы делаете. Однако разве это не хороший случай для setdefault?