列表推导式中的海象运算符(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(':')
]
回答
由于 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
- Thanks, I was forgetting the parentheses around walrus