【问题标题】:How to create a nested list conditioned on a parameter in python如何在python中创建一个以参数为条件的嵌套列表
【发布时间】:2021-02-10 08:58:47
【问题描述】:

我已经生成了一个按天计算的嵌套列表,并且想要计算登录和注销会话之间的总持续时间,并将该值单独存储在一个持续时间嵌套列表中,按登录发生的日期进行组织。

我的python脚本是:

import datetime
import itertools

Logintime = [
        datetime.datetime(2021,1,1,8,10,10), 
        datetime.datetime(2021,1,1,10,25,19),
        datetime.datetime(2021,1,2,8,15,10),
        datetime.datetime(2021,1,2,9,35,10)
        ]
Logouttime = [
        datetime.datetime(2021,1,1,10,10,11),
        datetime.datetime(2021,1,1,17,0,10), 
        datetime.datetime(2021,1,2,9,30,10),
        datetime.datetime(2021,1,2,17,30,12) 
       
        ]

Logintimedaywise = [list(group) for k, group in itertools.groupby(Logintime,
                                                   key=datetime.datetime.toordinal)]
Logouttimedaywise = [list(group) for j, group in itertools.groupby(Logouttime,
                                                   key=datetime.datetime.toordinal)]
print(Logintimedaywise)
print(Logouttimedaywise)

# calculate total duration 
temp = []
l = []
for p,q in zip(Logintimedaywise,Logouttimedaywise):
        for a,b in zip(p, q):
                tdelta = (b-a) 
                diff = int(tdelta.total_seconds())  / 3600 
                if diff not in temp:
                        temp.append(diff)
l.append(temp)
print(l)

此脚本生成以下输出(变量l 中的持续时间作为单例列表中的平面列表出现):

[[datetime.datetime(2021, 1, 1, 8, 10, 10), datetime.datetime(2021, 1, 1, 10, 25, 19)], [datetime.datetime(2021, 1, 2, 8, 15, 10), datetime.datetime(2021, 1, 2, 9, 35, 10)]]

[[datetime.datetime(2021, 1, 1, 10, 10, 11), datetime.datetime(2021, 1, 1, 17, 0, 10)], [datetime.datetime(2021, 1, 2, 9, 30, 10), datetime.datetime(2021, 1, 2, 17, 30, 12)]]

[[2.000277777777778, 6.5808333333333335, 1.25, 7.917222222222223]]

但我想要的输出格式是以下嵌套的持续时间列表(列表中的每个项目都应该是给定登录日的持续时间列表):

[[2.000277777777778, 6.5808333333333335] , [1.25, 7.917222222222223]]

任何人都可以帮助我如何根据登录日期将总持续时间存储为嵌套列表?

提前致谢。

【问题讨论】:

  • 如果登录和注销在不同的日子怎么办?然后 logintimedaywise 和 logouttimedaywise 的一些内部列表将具有不同数量的元素,并且您的脚本会中断...我将首先获取持续时间(注销 - 登录),然后将结果列表排序为仅根据组织的嵌套列表登录日

标签: python python-3.x list nested-lists


【解决方案1】:

尝试改变这种代码的和平:

# calculate total duration 
temp = []
l = []
for p,q in zip(Logintimedaywise,Logouttimedaywise):
        for a,b in zip(p, q):
                tdelta = (b-a) 
                diff = int(tdelta.total_seconds())  / 3600 
                if diff not in temp:
                        temp.append(diff)
l.append(temp)
print(l)

收件人:

# calculate total duration 
l = []
for p,q in zip(Logintimedaywise,Logouttimedaywise):
        l.append([])
        for a,b in zip(p, q):
                tdelta = (b-a) 
                diff = int(tdelta.total_seconds())  / 3600 
                if diff not in l[-1]:
                        l[-1].append(diff)
print(l)

那么输出将是:

[[datetime.datetime(2021, 1, 1, 8, 10, 10), datetime.datetime(2021, 1, 1, 10, 25, 19)], [datetime.datetime(2021, 1, 2, 8, 15, 10), datetime.datetime(2021, 1, 2, 9, 35, 10)]]
[[datetime.datetime(2021, 1, 1, 10, 10, 11), datetime.datetime(2021, 1, 1, 17, 0, 10)], [datetime.datetime(2021, 1, 2, 9, 30, 10), datetime.datetime(2021, 1, 2, 17, 30, 12)]]
[[2.000277777777778, 6.5808333333333335], [1.25, 7.917222222222223]]

我为每次迭代添加一个新的子列表。

【讨论】:

    【解决方案2】:

    如果同一会话的登录和注销发生在不同的日期,您的解决方案和@U11-Forward 的答案将中断,因为LogintimedaywiseLogouttimedaywise 中的内部列表将具有不同数量的元素。

    为避免这种情况,一种更简单的解决方案是,如果您首先计算所有登录、注销对的持续时间,然后仅根据登录日期(或您希望的注销日期)创建嵌套列表,如下所示:

    import datetime
    import itertools
    import numpy
    
    # define the login and logout times
    Logintime = [datetime.datetime(2021,1,1,8,10,10),datetime.datetime(2021,1,1,10,25,19),datetime.datetime(2021,1,2,8,15,10),datetime.datetime(2021,1,2,9,35,10)]
    Logouttime = [datetime.datetime(2021,1,1,10,10,11),datetime.datetime(2021,1,1,17,0,10), datetime.datetime(2021,1,2,9,30,10),datetime.datetime(2021,1,2,17,30,12) ] 
    
    # calculate the duration and the unique days in the set
    duration = [ int((logout - login).total_seconds())/3600 for login,logout in zip(Logintime,Logouttime) ]
    login_days = numpy.unique([login.day for login in Logintime])
    
    # create the nested list of durations
    # each inner list correspond to a unique login day
    Logintimedaywise =  [[ login for login in Logintime if login.day == day ] for day in login_days ]
    Logouttimedaywise = [[ logout for login,logout in zip(Logintime,Logouttime) if login.day == day ] for day in login_days ]
    duration_daywise = [[ d for d,login in zip(duration,Logintime) if login.day == day ] for day in login_days ]
    
    # check
    print(Logintimedaywise)
    print(Logouttimedaywise)
    print(duration_daywise)
    

    输出

    [[datetime.datetime(2021, 1, 1, 8, 10, 10), datetime.datetime(2021, 1, 1, 10, 25, 19)], [datetime.datetime(2021, 1, 2, 8, 15, 10), datetime.datetime(2021, 1, 2, 9, 35, 10)]]
    [[datetime.datetime(2021, 1, 1, 10, 10, 11), datetime.datetime(2021, 1, 1, 17, 0, 10)], [datetime.datetime(2021, 1, 2, 9, 30, 10), datetime.datetime(2021, 1, 2, 17, 30, 12)]]
    [[2.000277777777778, 6.5808333333333335], [1.25, 7.917222222222223]]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-11
      • 2022-01-16
      • 1970-01-01
      • 2017-10-01
      • 1970-01-01
      • 2011-09-27
      相关资源
      最近更新 更多