Python как использовать несколько циклов for для понимания списка с условиями

#python #python-3.x #for-loop #list-comprehension

#python #python-3.x #цикл for #понимание списка

Вопрос:

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

 import calendar as c
def solve(first, last):
    weekends = []
    # x = [weekends.append(m) if c.weekday(y,m,1) == 4 and c.weekday(y,m,31) == 6 else 0 for m in [1,3,5,7,8,10,12] for y in range(first,last 1)]
    for y in range(first,last 1):
        for m in [1,3,5,7,8,10,12]:
            if c.weekday(y,m,1) == 4 and c.weekday(y,m,31) == 6:
                weekends.append(m)
    return c.month_abbr[weekends[0]], c.month_abbr[weekends[len(weekends)-1]], len(weekends)
  

При вызове для : solve(2016,2020)

Этот код возвращает первый месяц 2016 года, в котором 5 пятниц, суббот, воскресений; то же самое для последнего месяца 2020 года и сколько месяцев удовлетворяет этому условию.

Таким образом, вывод : ('Jan', 'May', 5)

Часть комментария переменной x — это то, что я пробовал, и это возвращает 0 и None (причина утверждения else)

Ответ №1:

Порядок операторов в вашем x = ... немного перепутан; вы if должны фильтровать, какие значения включать, а не какое из двух альтернативных значений использовать. Но также: не используйте append в понимании списка для добавления в другой список! Вместо этого вашим результатом должно быть само понимание списка.

 def solve(first, last):
    weekends = [c.month_abbr[m] for y in range(first,last 1)
                                for m in [1,3,5,7,8,10,12]
                                if c.weekday(y,m,1) == 4]
    return weekends[0], weekends[-1], len(weekends)
  

Некоторые незначительные моменты, которые я исправил:

  • получить month_abbr непосредственно в list comp вместо двух раз в конце
  • -1 сам по себе является допустимым индексом
  • две проверки в будний день избыточны

Комментарии:

1. Спасибо за ваше решение.