#python #list #dictionary #list-comprehension
#python #Список #словарь #понимание списка
Вопрос:
У меня есть строка (которую я рассматриваю как список символов), и я пытаюсь с помощью понимания словаря создать словарь с ключами каждого символа в строке и значениями в виде списка индексов, в которых он появился.
Например:
pattern = "abcdabccb"
требуемый словарь:
{'a' : [0,4], 'b' : [1,5,8], 'c':[2,6,7], 'd':[3]}
Лучшая попытка до сих пор:
{pattern[i]: [i] for i in range(0, len(pattern)) if pattern[i] != '_'}
возвращает только последний индекс, в котором появился символ.
Заранее спасибо!
Комментарии:
1. Это было бы понимание словаря
2. как вы можете видеть, я использую его, все еще не работает
3. В любом случае, выполнение этого с пониманием словаря заставляет вас делать что-то неэффективное, например
{c:[i for i,e in enumerate(pattern) if e == c] for c in set(pattern)}
. Просто используйте обычную идиому группировки.4. почему я не могу принять ваш ответ? @juanpa.arrivillaga
5. Это не ответ, это комментарий 🙂
Ответ №1:
Это забавный вопрос. Вам понадобится понимание списка в рамках понимания dict:
>>> p = "abcdabccb"; # pattern
>>> {c: [i for i in range(len(p)) if p[i] == c] for c in p}
{'a': [0, 4], 'b': [1, 5, 8], 'c': [2, 6, 7], 'd': [3]}
>>>
Простыми словами, вот что говорит понимание:
Создайте словарь, перебрав каждый символ c
в шаблоне p
. Используйте каждый c
из них в качестве ключа, и пусть соответствующее значение будет списком таких индексов i
в p
, где p[i] == c
.
Вместо for c in p
этого вы можете использовать for c in set(p)
для перебора каждого символа только один раз.
Как указывает @quamrana, вы всегда можете использовать цикл. Здесь цикл был бы гораздо более читабельным. Но для оттачивания навыков понимания диктанта это довольно хорошая практическая задача.
Ответ №2:
Понимание словаря должно использоваться там, где map
или filter
могло быть использовано. То dict
, что вам нужно, — это краткое изложение входной строки.
Вам просто нужно вернуться к простому циклу for:
from collections import defaultdict
pattern = "abcdabccb"
summary = defaultdict(list)
for idx,c in enumerate(pattern):
summary[c].append(idx)
Вывод по мере необходимости