如何创建以 python 中的参数为条件的嵌套列表

How to create a nested list conditioned on a parameter in python

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

我的 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]]

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

提前致谢。

尝试更改这段代码:

# 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]]

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

如果同一会话的登录和注销发生在不同的日子,您的解决方案和@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]]