Нахождения числа вхождения одиннаковых строк в списке(python)
У меня был изначально такой список.
array = ['Саша','Олег','Саша','Саша','Костя','Костя','Олег','Саша']
Надо было найти сколь раз встречается каждый уникальный элемент в нем . С этой задачей я справился так
array_d = dict.fromkeys(array, 0)
for a in array:
array_d[a] += 1
strings = []
for key,item in array_d.items():
strings.append("{}: {}".format(key.capitalize(), item))
result = "\n".join(strings)
print(result)
В результате получал
Саша: 4
Олег: 2
Костя: 2
Список получал выборкой из базы данных. В результате запроса возращался полный список записей за все время. Теперь хотелось бы разбить этот список по дням. Чтобы получить статистику по каждому дню(знаю что можно указывать в запросе к бд конкретную дату и по ней отбирать. но хотелось бы получить за 1 запрос все данные и потом разбить их по дням). Добавил в запросе чтобы в список добавлялись и даты. Теперь получаю такой список
array1 = [
[datetime.datetime(2020, 10, 27, 12, 37), 'Саша'],
[datetime.datetime(2020, 10, 28, 16, 2), 'Олег'],
[datetime.datetime(2020, 10, 27, 16, 40), 'Саша'],
[datetime.datetime(2020, 10, 27, 16, 41), 'Саша'],
[datetime.datetime(2020, 10, 27, 12, 54), 'Костя'],
[datetime.datetime(2020, 10, 27, 12, 27), 'Костя'],
[datetime.datetime(2020, 10, 27, 12, 27), 'Олег'],
[datetime.datetime(2020, 10, 27, 12, 54), 'Саша']
]
как теперь можно получить из него список по дням? в результате хочу получить Ж
2020-10-27
Саша: 4
Олег: 1
Костя: 2
2020-10-28
Олег: 1
Ответы (3 шт):
Создай еще один уровень словаря и возьми дату за ключ:
{Дата : [имя1, имя2, имя3], дата2 : [имя1, имя2, имя3]}
потом обработай по такому же принципу как делал до этого.
Например:
date_dict = {}
for i in array:
if i[0] in date_dict:
date_dict[i[0]].append(i[1])
else:
date_dict.update({i[0] : [i[1], ]})
В итоге получится словарь, где каждой дате соответствует список с нужными именами. А там по циклу обрабатыааешь каждый ключ
Использование:
defaultdict-- для группировки юзеров по дате. Ключом будет дата, а значением списокCounter-- для подсчета количества элементов. Ключом будет элемент, а значением количество
Пример:
import datetime
from collections import defaultdict, Counter
array1 = [
[datetime.datetime(2020, 10, 27, 12, 37), 'Саша'],
[datetime.datetime(2020, 10, 28, 16, 2), 'Олег'],
[datetime.datetime(2020, 10, 27, 16, 40), 'Саша'],
[datetime.datetime(2020, 10, 27, 16, 41), 'Саша'],
[datetime.datetime(2020, 10, 27, 12, 54), 'Костя'],
[datetime.datetime(2020, 10, 27, 12, 27), 'Костя'],
[datetime.datetime(2020, 10, 27, 12, 27), 'Олег'],
[datetime.datetime(2020, 10, 27, 12, 54), 'Саша']
]
date_by_users = defaultdict(list)
for dt, user in array1:
date_by_users[dt.date()].append(user)
for d, users in date_by_users.items():
print(d)
for user, number in Counter(users).items():
print(f'{user}: {number}')
print()
Результат:
2020-10-27
Саша: 4
Костя: 2
Олег: 1
2020-10-28
Олег: 1
result = {}
for date, name in array1:
if date.date() not in result:
result[date.date()] = {}
result[date.date()][name] = result[date.date()].get(name, 0) + 1