列表推导中的海象运算符 (python)

问题描述 投票:0回答:2

在编码时,我真的很喜欢使用列表推导式来转换数据,并且我尽量避免 for 循环。现在我发现海象运算符对此非常方便,但是当我尝试在代码中使用它时,它似乎不起作用。我有以下代码,并希望通过简单的一行将包含有关时间戳的数据的字符串转换为日期时间对象,但出现语法错误,并且我不确定正确的语法是什么,有人知道我做了什么错了?

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

python list list-comprehension python-assignment-expression
2个回答
24
投票

由于 Walrus 算子不支持值拆包,因此操作

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

无效。

海象运算符建议主要用于逻辑比较,尤其是当您需要在比较中重用变量时。 因此,我认为对于这种情况,简单的

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


7
投票

...并且想要通过简单的一行将包含时间戳数据的字符串转换为日期时间对象,

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

timestamps_dt = [datetime.strptime(d, '%d:%H:%M:%S') for d in timestamps]
© www.soinside.com 2019 - 2024. All rights reserved.