繁体   English   中英

要列出或听写的元组的元组

[英]Tuple of tuples to list or dict

我正在写一个工作规划器,下面是一个 sqlite3 查询结果。 我想要的是按工程师(例如“Dan”)以及他们是否有任何工作(最后一列)或正在度假(倒数第二列)对数据进行分组。

所以理想情况下,我可能想要一个为每个工程师提供一个密钥的字典,为每一天提供一个密钥,或者:

  • 当天的工作清单
  • 他们在度假
  • 他们那天没有工作

我试过以下

jobs = {}
for j in res:
    jobs.setdefault(j[0], []).append(j[1:])


jobs2 = {}
for j in res:
    jobs2.setdefault((j[0], j[1]), []).append(j[2:])

但无法弄清楚如何使用 setdefault 或 dict 理解来获得我需要的数据结构。 任何想法表示赞赏。

这是数据:

('Dan', '2021-03-11', 'Thu', '2021-03-11', 'am', '11/03', 'Customer 1', '', 'U6kfoP9QPDw', None, 0, 1)                                                                                                                                 
('Dan', '2021-03-12', 'Fri', None, None, None, None, None, None, None, 0, 0)                                                                                                                                                                  
('Dan', '2021-03-13', 'Sat', None, None, None, None, None, None, None, 0, 0)                                                                                                                                                                  
('Dan', '2021-03-14', 'Sun', None, None, None, None, None, None, None, 0, 0)                                                                                                                                                                  
('Dan', '2021-03-15', 'Mon', None, None, None, None, None, None, None, 0, 0)                                                                                                                                                                  
('Dan', '2021-03-16', 'Tue', None, None, None, None, None, None, None, 0, 0)                                                                                                                                                                  
('Dan', '2021-03-17', 'Wed', None, None, None, None, None, None, None, 0, 0)                                                                                                                                                                  
('Gareth', '2021-03-11', 'Thu', None, None, None, None, None, None, None, 0, 0)                                                                                                                                                               
('Gareth', '2021-03-12', 'Fri', '2021-03-12', 'am', '12/03', 'Customer 4', '', 'k-uFnkwLLdo', None, 0, 2)                                                                                                                              
('Gareth', '2021-03-12', 'Fri', '2021-03-12', 'pm', '12/03', 'Customer 2', '', 'TWQdiG3piAE', None, 0, 2)
('Gareth', '2021-03-13', 'Sat', None, None, None, None, None, None, None, 0, 0)                                        
('Gareth', '2021-03-14', 'Sun', None, None, None, None, None, None, None, 0, 0)                                        
('Gareth', '2021-03-15', 'Mon', None, None, None, None, None, None, None, 0, 0)                                        
('Gareth', '2021-03-16', 'Tue', None, None, None, None, None, None, None, 0, 0)                                        
('Gareth', '2021-03-17', 'Wed', None, None, None, None, None, None, None, 0, 0)                                        
('Garth', '2021-03-11', 'Thu', None, None, None, None, None, None, None, 0, 0)                                         
('Garth', '2021-03-12', 'Fri', None, None, None, None, None, None, None, 0, 0)                                         
('Garth', '2021-03-13', 'Sat', None, None, None, None, None, None, None, 0, 0)                                         
('Garth', '2021-03-14', 'Sun', None, None, None, None, None, None, None, 0, 0)                                         
('Garth', '2021-03-15', 'Mon', None, None, None, None, None, None, None, 0, 0)                                         
('Garth', '2021-03-16', 'Tue', None, None, None, None, None, None, None, 0, 0)                                         
('Garth', '2021-03-17', 'Wed', None, None, None, None, None, None, None, 0, 0)                                         
('Ian', '2021-03-11', 'Thu', '2021-03-11', 'am', '11/03', 'Customer 3', '', 'SCfbuLeQ9ig', None, 0, 1)
('Ian', '2021-03-12', 'Fri', None, None, None, None, None, None, None, 0, 0)                                           
('Ian', '2021-03-13', 'Sat', None, None, None, None, None, None, None, 0, 0)                                           
('Ian', '2021-03-14', 'Sun', None, None, None, None, None, None, None, 0, 0)                                           
('Ian', '2021-03-15', 'Mon', None, None, None, None, None, None, None, 0, 0)                                           
('Ian', '2021-03-16', 'Tue', None, None, None, None, None, None, None, 0, 0)                                           
('Ian', '2021-03-17', 'Wed', None, None, None, None, None, None, None, 0, 0)                                           
('Jim', '2021-03-11', 'Thu', None, None, None, None, None, None, None, 0, 0)                                           
('Jim', '2021-03-12', 'Fri', None, None, None, None, None, None, None, 0, 0)                                           
('Jim', '2021-03-13', 'Sat', None, None, None, None, None, None, None, 0, 0)                                           
('Jim', '2021-03-14', 'Sun', None, None, None, None, None, None, None, 0, 0)                                           
('Jim', '2021-03-15', 'Mon', None, None, None, None, None, None, None, 0, 0)                                           
('Jim', '2021-03-16', 'Tue', None, None, None, None, None, None, None, 0, 0)                                           
('Jim', '2021-03-17', 'Wed', None, None, None, None, None, None, None, 1, 0)                    

似乎一个字典就足够了。 外部字典将员工姓名作为键,内部字典将值作为键,将日期作为键,将工作/状态作为值。

ON_HOLIDAY = None

jobs = {}
for employee, date, *job in res:
    if employee not in jobs:
        jobs[employee] = dict()
    if date not in jobs[employee]:
        jobs[employee][date] = []
    if job[-2]:
        jobs[employee][date] = ON_HOLIDAY
    else:
        if job[-1]:
            jobs[employee][date].append(job[2:-2])

空列表表示该员工在该日期没有工作,但您也可以在解析完所有数据后使用另一个标识符更改它。

感谢 Reti43 的提示,我现在得到了这个:

jobs3 = {}
for nick, date, *job in res:
    jobs3.setdefault(nick, {}).setdefault(date, {}).setdefault('jobs', [])
    if job[-2]:
        jobs3[nick][date].update({'holiday': job[-3]})
    if job[-1]:
        jobs3[nick][date]['jobs'].append(job[2:-2])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM