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 шт):
Ну вот, например. Только я поменял '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}
если из элементов списка, то можно сделать очень просто:
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
в этом случае мы заполняем словарь по мере продвижения по списку - т.е. выполняем минимум действий
Воспользуйтесь методом словаря .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}