列表理解中的Walrus运算符(python)

2024-06-17 09:34:10 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,在编码时,我非常喜欢使用列表理解来转换数据,并尽量避免for循环。现在我发现walrus操作符在这方面非常方便,但当我尝试在代码中使用它时,它似乎不起作用。我有下面的代码,希望在一行简单的代码中将包含时间戳数据的字符串转换为datetime对象,但是我遇到了一个语法错误,我不确定正确的语法是什么,有人知道我做错了什么吗

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(':')
] 


Tags: 数据字符串代码编码列表fordatetime时间
2条回答

由于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

...and want to transform the strings containing data about the timestamps into datetime objects in one easy line,

如果要将字符串列表转换为datetime对象列表,可以使用以下一行:

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

相关问题 更多 >