Оператор моржа в понимании списков (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]
Другие вопросы по тегам