Оператор моржа в понимании списков (python)
Поэтому при кодировании мне очень нравится использовать списки для преобразования данных, и я стараюсь избегать циклов for. Теперь я обнаружил, что оператор моржа может быть действительно удобен для этого, но когда я пытаюсь использовать его в своем коде, он, похоже, не работает. У меня есть следующий код, и я хочу преобразовать строки, содержащие данные о временных метках, в объекты 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(':')
]
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
... и хотите преобразовать строки, содержащие данные о временных метках, в объекты datetime в одной простой строке,
Если вы хотите преобразовать список строк в список объектов datetime, вы можете использовать следующий лайнер:
timestamps_dt = [datetime.strptime(d, '%d:%H:%M:%S') for d in timestamps]