Используя python, создаем словарь, извлекая ключ: значение из списка - PullRequest
0 голосов
/ 17 января 2020

Мне нужно сделать два словаря из списка1:

list1 = [['8/16/2016 9:55', 6], ['11/22/2015 13:43', 29], ['5/2/2016 10:14', 1],
['8/2/2016 14:20', 3], ['10/15/2015 16:38', 17], ['9/26/2015 23:23', 1],
['4/22/2016 12:24', 4], ['11/16/2015 9:22', 1], ['2/24/2016 17:57', 1], 
['6/4/2016 17:17', 2]]

count_by_hour = {} # this is created by extracting the hour from index[0] of list1

Мне удалось получить это с помощью ответов на мой ранее опубликованный вопрос.

for each in list1:
   if each[0].split(':')[0][-2] == " ": #split by : to get second last char and check if >9
   hours.append(each[0].split(':')[0][-1:]) # if hour is <9 take last char which is hour
else:
   hours.append(each[0].split(':')[0][-2:]) #else take last 2 chars
print('Hour extracted:')
print(hours)

Вывод:

Counts by hour:
{'9': 2, '13': 1, '10': 1, '14': 1, '16': 1, '23': 1, '12': 1, '17': 2}

Теперь, как мне сделать следующее:

comments_by_hour = {}

Expected Outcome:
{9:7, 13:29, 10:1, 14:3, 16:17, 23:1, 12:4, 17:2} #value is a total for every hour that exists as a key in list1

Как всегда, любая помощь приветствуется.

1 Ответ

1 голос
/ 17 января 2020

Обратите внимание, что нам нужно накапливать сумму отдельно для каждой из множества категорий (часов). Простое решение (в чистом виде Python) объединяет шаблон аккумулятора при использовании словаря для хранения всех отсчетов.

Сначала давайте воспользуемся time.strptime, чтобы извлечь часы, используя понимание списка.

In [1]: list1 = [['8/16/2016 9:55', 6], ['11/22/2015 13:43', 29], ['5/2/2016 10:14', 1],
      : ['8/2/2016 14:20', 3], ['10/15/2015 16:38', 17], ['9/26/2015 23:23', 1],
      : ['4/22/2016 12:24', 4], ['11/16/2015 9:22', 1], ['2/24/2016 17:57', 1],
      : ['6/4/2016 17:17', 2]]

In [2]:  from time import strptime

In [3]: hour_list = [(strptime(time, "%m/%d/%Y %H:%M").tm_hour, val) for time, val in list1]

Решение состоит в том, чтобы использовать словарь для сбора статистики по каждой категории. Сделайте это, (а) начав с пустого словаря и (б) обновив суммы для каждого нового значения. Это можно сделать следующим образом.

In [4]: comments_by_hour = {}

In [5]: for hour, val in hour_list:
      :     comments_by_hour[hour] = val + comments_by_hour.get(hour, 0)
      :

In [6]: comments_by_hour
Out[6]: {9: 7, 13: 29, 10: 1, 14: 3, 16: 17, 23: 1, 12: 4, 17: 3}

Обратите внимание, что comments_by_hour.get(hour, 0) используется для получения текущего значения за этот час, если оно существует, или с помощью значения по умолчанию 0 в противном случае.

...