Словарь списков с использованием понимания списка

#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)
  

Вывод по мере необходимости