Вы получаете синтаксическую ошибку, потому что вам не разрешено выполнять назначения в пределах понимания списка.Python запрещает присваивания, потому что он препятствует сложным спискам в пользу циклов for.
Очевидно, что вы не должны делать это в одной строке, но вот как это сделать:
import datetime
# Example from your comment:
type1 = "some type"
main_list = [[], [],
[[1, 2, 3, datetime.date(2016, 8, 18), type1],
[3, 4, 5, datetime.date(2016, 8, 18), type1]], [], []]
def fmt_times(lst):
"""Format the fourth value of each element of each non-empty sublist"""
for i in range(len(lst)):
if lst[i] != []:
for j in range(len(lst[i])):
lst[i][j][3] = lst[i][j][3].strftime('%Y-%m-%d')
return lst
def fmt_times_one_line(main_list):
"""Format the fourth value of each element of each non-empty sublist"""
return [[] if main_list[i] == [] else [[main_list[i][j][k] if k != 3 else main_list[i][j][k].strftime('%Y-%m-%d') for k in range(len(main_list[i][j]))] for j in range(len(main_list[i])) ] for i in range(len(main_list))]
import copy
# Deep copy needed because fmt_times modifies the sublists.
assert fmt_times(copy.deepcopy(main_list)) == fmt_times_one_line(main_list)
Понимание списка - функциональная вещь.Если вы знаете, как map () работает в python или javascript, то это то же самое.В map () или понимании мы, как правило, не изменяем данные, которые мы отображаем (и python не рекомендует делать это), поэтому вместо этого мы воссоздаем весь объект, подставляя только те значения, которые мы хотели изменить.