首页 > 解决方案 > 使用python,通过从列表中提取键:值来创建字典

问题描述

我需要从 list1 制作两个字典:

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

一如既往,任何帮助表示赞赏。

标签: pythondatetimedictionary

解决方案


请注意,我们需要为许多类别(小时)中的每一个单独累积总和。一个简单的解决方案(在纯 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]

解决方案是使用字典来累积每个类别的统计信息。通过(a)从一个空字典开始并(b)更新每个新值的总和来做到这一点。这可以如下完成。

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。


推荐阅读