列表综合中的Walrus运算符(python)



所以在编码时,我真的很喜欢使用列表理解来转换数据,我尽量避免循环。现在我发现walrus操作符可以非常方便地实现这一点,但当我试图在代码中使用它时,它似乎不起作用。我有以下代码,想用一行简单的代码将包含时间戳数据的字符串转换为日期时间对象,但我遇到了语法错误,我不确定正确的语法是什么,有人知道我做错了什么吗?

from datetime import datetime
timestamps = ['30:02:17:36',
'26:07:44:25','25:19:30:38','25:07:40:47','24:18:29:05','24:06:13:15','23:17:36:39',
'23:00:14:52','22:07:04:33','21:15:42:20','21:04:27:53',
'20:12:09:22','19:21:46:25']
timestamps_dt = [
datetime(days=day,hours=hour,minutes=mins,seconds=sec) 
for i in timestamps
day,hour,mins,sec := i.split(':')
] 

由于Walrus运算符不支持值解包,因此操作

day,hour,mins,sec := i.split(':')

无效。

建议主要在逻辑比较中使用Walrus运算符,尤其是当您需要在比较中重用变量时<因此,我认为对于这种情况,简单的datetime.strptime()会更好>

如果你必须在列表理解中使用海象比较,你可以进行

from datetime import datetime
timestamps = ['30:02:17:36',
'26:07:44:25','25:19:30:38','25:07:40:47','24:18:29:05','24:06:13:15','23:17:36:39',
'23:00:14:52','22:07:04:33','21:15:42:20','21:04:27:53',
'20:12:09:22','19:21:46:25']
timestamps_dt = [
datetime(2020,11, *map(int, time)) # map them from str to int
for i in timestamps
if (time := i.split(':')) # assign the list to the variable time
]
print(timestamps_dt)

但这将导致一个问题,为什么不仅仅是

timestamps_dt = [
datetime(2020,11, *map(int, i.split(':'))) 
for i in timestamps
]

参考PEP-572

。。。并希望将包含时间戳数据的字符串转换为一行中的日期时间对象,

如果您想将字符串列表转换为日期时间对象列表,可以使用以下一行:

timestamps_dt = [datetime.strptime(d, '%d:%H:%M:%S') for d in timestamps]

最新更新