Перечислите Понимания, если еще повторяющийся элемент каждые три пункта - PullRequest
2 голосов
/ 24 сентября 2019

На этом сайте слишком много вопросов о списках, но ни один из них не соответствует тому, что я хотел бы сделать.Я уже сделал это с помощью цикла for, но мне было интересно, можно ли это сделать с помощью списочных представлений или кто-то может направить меня туда, где я могу найти аналогичный случай.

У меня есть список функций:

function_list=[iron,cobalt,nickel,copper,zinc,vanadium,chromium,managenese,titanium,footer]

Каждая функция - это вопрос, который я задаю своим студентам и экспортируется в файл PDF.Последняя функция в списке - нижний колонтитул , которая заставляет файл PDF вставить страницу, чтобы перейти на следующую страницу.

Итак, как обычно выглядит простой тест (до сих пор)?

call_functions([x for x in function_list[0:3]] + [function_list[-1]])

генерация

call_functions([iron,cobalt,nickel,footer]) #as desired

, где call_functions в основном экспортер PDF.Таким образом, мое понимание списка добавляет три вопроса и пропускает на следующую страницу, добавляя еще три.По мере роста количества вопросов код выглядит как беспорядок:

call_functions([x for x in function_list[0:3]] + [function_list[-1]] + [x for x in function_list[3:6]]+ [function_list[-1]] + [x for x in function_list[6:9]])

, генерирующий

call_functions([iron,cobalt,nickel,footer,copper,zinc,vanadium,footer,chromium,managenese,titanium]) #as desired

, хотя это работает, я пытаюсь составить единый список понимания, которыйперебирает список и после каждого третьего элемента вставляет последний элемент в список.Или даже оставить нижний колонтитул вне списка также жизнеспособным.Но я не могу заставить его работать.

Я пытался:

[x for i,x in enumerate(function_list[0:9]) if i%3==0 function_list[-1] else x]

до SyntaxError.

Также пытался:

[x if i%3==0 function_list[-1] else x for i,x in enumerate(function_list[0:9])]

Также к SyntaxError

Может ли кто-нибудь сказать мне (или направить меня), что я делаю неправильно, и / или направить в аналогичный случай, пожалуйста?

Спасибо

Ответы [ 2 ]

2 голосов
/ 24 сентября 2019
[func for i in range(0, len(function_list) - 1, 3) for func in function_list[i:i+3] + [function_list[-1]]]

вывод:

>>>

['iron',
 'cobalt',
 'nickel',
 'footer',
 'copper',
 'zinc',
 'vanadium',
 'footer',
 'chromium',
 'managenese',
 'titanium',
 'footer']
0 голосов
/ 24 сентября 2019

Неважно, я думаю, что заставил его работать.

Для меня сработало следующее:

call_functions([x if (i+1)%4!=0 else function_list[-1] for i,x in enumerate(function_list)])

Если я сделаю

if i%4!=0 #making the fourth element function footer

Я получусписок, который начинается с функции footer .Но делаю:

if (i+1)%4!=0

Я избегаю первоначальной проблемы.Я получаю:

call_functions([iron,cobalt,nickel,footer,copper,zinc,vanadium,footer,chromium,managenese,titanium,footer])

Я уверен, что должны быть другие способы сделать это проще и аккуратнее, любые предложения приветствуются.

Спасибо!

Пример.

...