Организация / Форматирование кода Python в одну строку - PullRequest
0 голосов
/ 08 октября 2018

Есть ли способ переписать приведенный ниже код Python в одну строку

for i in range(len(main_list)):
  if main_list[i] != []:
   for j in range(len(main_list[i])):
     main_list[i][j][6]=main_list[i][j][6].strftime('%Y-%m-%d')

примерно так, как показано ниже,

 [main_list[i][j][6]=main_list[i][j][6].strftime('%Y-%m-%d') for i in range(len(main_list)) if main_list[i] != [] for j in range(len(main_list[i]))]

Я получил за это SyntaxError.

На самом деле, я пытаюсь сохранить все значения, извлеченные из таблицы в один список.Поскольку таблица содержит метод даты / тип данных, мое требование должно преобразовать его в строку, поскольку я столкнулся с ошибкой в ​​форме строки.

Так что мой подход заключается в преобразовании этого элемента списка из datetime.date () в str.И у меня все получилось.Просто хотел, чтобы он работал с одной строкой

Ответы [ 3 ]

0 голосов
/ 08 октября 2018

Одна строка?

main_list = convert_list(main_list)

Вам придется разместить еще несколько строк в другом месте, хотя:

def convert_list(main_list):
    for i, ml in enumerate(main_list):
        if isinstance(ml, list) and len(ml) > 0:
            main_list[i] = convert_list(ml)
        elif isinstance(ml, datetime.date):
            main_list[i] = ml.strftime('%Y-%m-%d')
    return main_list

Возможно, вы сможете разбить это вместе с пониманием списка, ноэто ужасная идея (по причинам, лучше объясненным в другом ответе).

0 голосов
/ 08 октября 2018

Вы получаете синтаксическую ошибку, потому что вам не разрешено выполнять назначения в пределах понимания списка.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 не рекомендует делать это), поэтому вместо этого мы воссоздаем весь объект, подставляя только те значения, которые мы хотели изменить.

0 голосов
/ 08 октября 2018

Используйте явный цикл for.Нет лучшего варианта.

Понимание списка используется для создания нового списка, а не для изменения определенных элементов существующего списка.

Возможно, вы сможете обновитьзначения через понимание списка, например, [L.__setitem__(i, 'some_value') for i in range(len(L))], но это не рекомендуется, так как вы используете побочный эффект и в процессе создания списка None значений, которые вы затем отбрасываете.

Вы также можетенапишите запутанное понимание списка с помощью троичного выражения, указывающего, когда вы встречаете 6-й элемент в 3-м вложенном подсписке.Но это усложнит поддержку вашего кода.

Короче говоря, используйте цикл for.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...