为了账号安全,请及时绑定邮箱和手机立即绑定

从单个列表创建字典字典 - Python3

从单个列表创建字典字典 - Python3

慕雪6442864 2021-10-12 17:36:36
Linux 上的 Python 3.6.5/3.7.1努力创建一个以字典为值的字典。我想从列表日期和时间数据创建一个字典(最终创建带有散景的图表)。以前肯定有人问过这个问题,但我找不到一组搜索词来返回对我来说澄清问题的结果。nb 我本质上是一个爱好编码器,并且我不容易像真正的程序员一样在算法上思考。数据在一个列表中(最多 3200 个项目):每个项目是一个日期在一个小时的时钟周期内发生的事件的记录。因此; ['03/01/19 09:00', '03/01/19 09:00', '03/01/19 09:00',]表示 03/01/2019 0900-1000 之间的 3 个事件。只记录带有事件的时钟周期,因此如果没有事件,则没有时间戳。nb 日期格式是 ddmmyy示例数据:dtl = [    '06/01/19 12:00', '06/01/19 12:00', '06/01/19 11:00', '05/01/19 21:00',    '05/01/19 17:00', '05/01/19 17:00', '05/01/19 14:00', '03/01/19 21:00',    '03/01/19 17:00', '03/01/19 12:00', '03/01/19 12:00', '03/01/19 12:00',    '03/01/19 12:00', '03/01/19 12:00', '03/01/19 11:00', '03/01/19 10:00',    '03/01/19 10:00', '03/01/19 09:00','03/01/19 09:00','03/01/19 09:00',]所需的字典如下所示:dtd = {    '03/01/19': {         '00': 0, '01': 0, '02': 0, '03': 0, '04': 0, '05': 0,         '06': 0, '07': 0, '08': 0, '09': 3, '10': 2, '11': 1,         '12': 5, '13': 0, '14': 0, '15': 0, '16': 0, '17': 1,         '18': 0, '19': 0, '20': 0, '21': 1, '22': 0, '23': 0,     },     '04/01/19': {         '00': 0, ... '23': 0     },     '05/01/19': {         '00': 0, ...      } ... etc}显然,我至少可以用以下键初始化字典:{i.split()[0]:{} for i in dtl}但是后来我无法理解我需要做什么来更新带有计数的 subdicts,因此看不到从原始列表到所需字典的方法。我在兜兜转转!
查看完整描述

3 回答

?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

一旦按日期拆分为字典,就可以将 aCounter与 a结合起来defaultdict非常有效地执行此操作。所以首先按日期拆分:


from collections import Counter, defaultdict


dtd = defaultdict(list)

for date, time in (item.split() for item in dtl):

    dtd[date].append(time[:2])

现在您可以轻松地计算现有项目,并使用它们来初始化一个defaultdict将在缺失时间返回零的值:


for key in dtd:

    dtd[key] = defaultdict(int, Counter(dtd[key]))

结果是:


defaultdict(list, {

    '03/01/19': defaultdict(int, {

        '09': 3,

        '10': 2,

        '11': 1,

        '12': 5,

        '17': 1,

        '21': 1

    }),

    '05/01/19': defaultdict(int, {'14': 1, '17': 2, '21': 1}),

    '06/01/19': defaultdict(int, {'11': 1, '12': 2})

})

由于这里的对象是defaultdicts,您将能够查询不在原始数据集中的日期和时间。您可以通过dict在完成后将结果转换为仅包含您想要的键的正则来避免这种情况:


hours = ['%02d' % h for h in range(24)]

dtd = {date: {h: d[h] for h in hours} for date, d in dtd}


查看完整回答
反对 回复 2021-10-12
?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

我建议使用,collections.defaultdict因为您的某些计数可能为 0。


这是一个选项:


from collections import defaultdict


dtl = ['06/01/19 12:00', '06/01/19 12:00', '06/01/19 11:00', 

       '05/01/19 21:00', '05/01/19 17:00', '05/01/19 17:00', 

       '05/01/19 14:00', '03/01/19 21:00', '03/01/19 17:00',

       '03/01/19 12:00', '03/01/19 12:00', '03/01/19 12:00', 

       '03/01/19 12:00', '03/01/19 12:00', '03/01/19 11:00', 

       '03/01/19 10:00', '03/01/19 10:00', '03/01/19 09:00',

       '03/01/19 09:00','03/01/19 09:00',]


# Nested defaultdict

result = defaultdict(lambda: defaultdict(int))


for date_time in dtl:

    date, time = date_time.split()

    result[date][time.split(':')[0]] += 1

输出(使用pprint):


defaultdict(<function <lambda> at 0x7f20d5c37c80>,

            {'03/01/19': defaultdict(<class 'int'>,

                                     {'09': 3,

                                      '10': 2,

                                      '11': 1,

                                      '12': 5,

                                      '17': 1,

                                      '21': 1}),

             '05/01/19': defaultdict(<class 'int'>,

                                     {'14': 1,

                                      '17': 2,

                                      '21': 1}),

             '06/01/19': defaultdict(<class 'int'>, {'12': 2, '11': 1})})

如果您真的想显示0for 打印,那么我真的看不到times像我在这里所做的那样保留数组并以dict这种方式初始化您的方法。


times = ['00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '10',

         '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21',

         '22', '23']


dtl = ['06/01/19 12:00', '06/01/19 12:00', '06/01/19 11:00', 

       '05/01/19 21:00', '05/01/19 17:00', '05/01/19 17:00', 

       '05/01/19 14:00', '03/01/19 21:00', '03/01/19 17:00',

       '03/01/19 12:00', '03/01/19 12:00', '03/01/19 12:00', 

       '03/01/19 12:00', '03/01/19 12:00', '03/01/19 11:00', 

       '03/01/19 10:00', '03/01/19 10:00', '03/01/19 09:00',

       '03/01/19 09:00','03/01/19 09:00']


result = {date_time.split()[0] : {time : 0 for time in times} for date_time in dtl}


for date_time in dtl:

    date, time = date_time.split()

    result[date][time.split(':')[0]] += 1

输出如下:


{'06/01/19': {'00': 0, '01': 0, '02': 0, '03': 0, '04': 0, '05': 0, '06': 0, '07': 0, '08': 0, '09': 0, '10': 0, '11': 1, '12': 2, '13': 0, '14': 0, '15': 0, '16': 0, '17': 0, '18': 0, '19': 0, '20': 0, '21': 0, '22': 0, '23': 0}, '05/01/19': {'00': 0, '01': 0, '02': 0, '03': 0, '04': 0, '05': 0, '06': 0, '07': 0, '08': 0, '09': 0, '10': 0, '11': 0, '12': 0, '13': 0, '14': 1, '15': 0, '16': 0, '17': 2, '18': 0, '19': 0, '20': 0, '21': 1, '22': 0, '23': 0}, '03/01/19': {'00': 0, '01': 0, '02': 0, '03': 0, '04': 0, '05': 0, '06': 0, '07': 0, '08': 0, '09': 3, '10': 2, '11': 1, '12': 5, '13': 0, '14': 0, '15': 0, '16': 0, '17': 1, '18': 0, '19': 0, '20': 0, '21': 1, '22': 0, '23': 0}}



查看完整回答
反对 回复 2021-10-12
?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

一种快速而肮脏的方法是:


#!/usr/bin/env python3


def convert(dt):

    ret = {}

    for elem in dt:

        d,t = elem.split()

        t = t.split(":")[0]

        # not a valid value

        if not d: pass


        # we inserted d already

        if d in ret:

            if t in ret[d]:

                ret[d][t] += 1

        else:

            ret[d] = {'00': 0, '01': 0, '02': 0, '03': 0, '04': 0, '05': 0,

                    '06': 0, '07': 0, '08': 0, '09': 0, '10': 0, '11': 0, 

                    '12': 0, '13': 0, '14': 0, '15': 0, '16': 0, '17': 0, 

                    '18': 0, '19': 0, '20': 0, '21': 0, '22': 0, '23': 0 }

    return ret


dtl = ['06/01/19 12:00', '06/01/19 12:00', '06/01/19 11:00', '05/01/19 21:00', '05/01/19 17:00', '05/01/19 17:00', '05/01/19 14:00', '03/01/19 21:00', '03/01/19 17:00','03/01/19 12:00', '03/01/19 12:00', '03/01/19 12:00', '03/01/19 12:00', '03/01/19 12:00', '03/01/19 11:00', '03/01/19 10:00', '03/01/19 10:00', '03/01/19 09:00','03/01/19 09:00','03/01/19 09:00']


print(convert(dtl))


查看完整回答
反对 回复 2021-10-12
  • 3 回答
  • 0 关注
  • 200 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号