Python, как из списка сделать словарь

Как из списка типа ['a', 's', 'd', '1', 's', 'd', 'w', 'e', 'q'] сделать словарь такого вида: {'a': 2, 'b': 0 .... }, то есть сколько раз повторяется элемент в списке - такое число добавить в словарь.

Примечания: словарь можно НЕ строить из элементов что в списке, можно взять готовый скелет, пример:

{'a': 0, 'b': 0, 'c': 0, ...} 

но если лучше или легче из элементов, которые в списке - пожалуйста.

UPDATE

['a', 's', 'd', '1', 's', 'd', 'w', 'e', 'q'] - это не пример данных)

Тут список может быть и следующий:

['=', 'w', 'r', 'p', 'f', ';', 'a', 'e', 'e', '[', 'w', 'q', 'r', "'", 'q', 'r', '3', 'caps lock', ';', 'D', 'A', 'S', 'D', 'shift', 'alt', 'ctrl', 'F', '.', 'C', 'R', ']', 'Q', '=', '3', '1', '2', '3', 'F', 'A', 'S', 'R', 'ctrl', 'C']

Это обычный ввод с клавиатуры и мне нужно как раз сложить это в словарь и отправить в базу данных.


Ответы (3 шт):

Автор решения: CrazyElf

Ну вот, например. Только я поменял '1' на 'a', а то иначе что-то не сходится в задании и 'a': 2 не получится:

from string import ascii_lowercase

d = {k: 0 for k in ascii_lowercase}
for k in ['a', 's', 'd', 'a', 's', 'd', 'w', 'e', 'q']:
    d[k] += 1

print(d)

Вывод:

{'a': 2, 'b': 0, 'c': 0, 'd': 2, 'e': 1, 'f': 0, 'g': 0, 'h': 0, 'i': 0, 'j': 0, 'k': 0, 'l': 0, 'm': 0, 'n': 0, 'o': 0, 'p': 0, 'q': 1, 'r': 0, 's': 2, 't': 0, 'u': 0, 'v': 0, 'w': 1, 'x': 0, 'y': 0, 'z': 0}
→ Ссылка
Автор решения: Zhihar

если из элементов списка, то можно сделать очень просто:

arr = ['a', 's', 'd', '1', 's', 'd', 'w', 'e', 'q']

res = dict((i, arr.count(i)) for i in arr)

print(res)

если из скажем всех латинских букв и цифр, то

import string

arr = ['a', 's', 'd', '1', 's', 'd', 'w', 'e', 'q']

res = dict((i, arr.count(i)) for i in string.ascii_lowercase + string.digits)

print(res)

можно конечно использовать map еще, но код длиннее получается:

res = dict(map(lambda i: (i, arr.count(i)), arr))

P.S.

и конечно сразу стоит сказать, что если есть жесткие требования к скорости работы алгоритма, то лучше использовать другой подход, который сводит вызов count к минимуму (чтобы не выполнять лишние команды), например так:

res = {}

for i in arr:
    if i not in res:
        res[i] = arr.count(i)

теперь count будет вызываться только 1 раз на уникальный элемент из списка

можно сделать еще более оптимально - ведь count подсчет начинает вести с самого начала списка, а это не требуется ибо список мы уже просматриваем, тогда код будет выглядеть так:

res = {}

for i in arr:
    res[i] = 1 if i not in res else res[i] + 1

в этом случае мы заполняем словарь по мере продвижения по списку - т.е. выполняем минимум действий

→ Ссылка
Автор решения: Jack_oS

Воспользуйтесь методом словаря .get(). Он возвращает значение по ключу, если таковой есть в словаре, или None по-умолчанию, если ключа нет (и никогда не бросает исключения), но можно изменить None на свое значение. И оформите в виде функции для универсального использования:

def counter(my_list: list) -> dict:
    result = {}

    for i in my_list:
        result[i] = result.get(i, 0) + 1
    
    return result

тогда при:

my_list = ['=', 'w', 'r', 'p', 'f', ';', 'a', 'e', 'e', '[', 'w', 'q', 'r', '"', 'q', 'r', '3', 'caps lock', ';', 'D', 'A', 'S', 'D', 'shift', 'alt', 'ctrl', 'F', '.', 'C', 'R', ']', 'Q', '=', '3', '1', '2', '3', 'F', 'A', 'S', 'R', 'ctrl', 'C']

результат будет следующим:

>>> counter(my_list)
{'=': 2, 'w': 2, 'r': 3, 'p': 1, 'f': 1, ';': 2, 'a': 1, 'e': 2, '[': 1, 'q': 2, '"': 1, '3': 3, 'caps lock': 1, 'D': 2, 'A': 2, 'S': 2, 'shift': 1, 'alt': 1, 'ctrl': 2, 'F': 2, '.': 1, 'C': 2, 'R': 2, ']': 1, 'Q': 1, '1': 1, '2': 1}
→ Ссылка