'''Тема урока: списочные выражения
Списочные выражения
Решение задач
Аннотация. Списочные выражения. Создание списков без явного использования циклов и вызова списочного метода append().

Создание списков
Для того, чтобы создать список состоящий из 1010 нулей мы можем использовать следующий код:

zeros = []
for i in range(10):
    zeros.append(0)
В Python, однако есть более простой и компактный способ для создания такого списка. Мы можем использовать оператор
умножения списка на число:

zeros = [0] * 10
Для создания списков, заполненных по более сложным правилам нам приходится явно использовать цикл for.

Например, для создания списка целых чисел от 00 до 99, мы вынуждены писать такой код:

numbers = []
for i in range(10):
    numbers.append(i)
Такой код хоть и не является сложным, однако достаточно громоздок.

Списочные выражения
В Python есть механизм для создания списков из неповторяющихся элементов. Такой механизм называется — списочное
выражение (list comprehension).

Предыдущий код можно записать следующим образом:

numbers = [i for i in range(10)]
Общий вид списочного выражения следующий:

[выражение for переменная in последовательность]

где переменная — имя некоторой переменной, последовательность — последовательность значений, которые она принимает
(список, строка или объект, полученный при помощи функции range), выражение — некоторое выражение, как правило,
зависящее от использованной в списочном выражении переменной, которым будут заполнены элементы списка.

Примеры использования списочных выражений
1. Создать список, заполненный 10 нулями можно и при помощи списочного выражения:

zeros = [0 for i in range(10)]
2. Создать список, заполненный квадратами целых чисел от 0 до 9 можно так:

squares = [i ** 2 for i in range(10)]
3. Создать список, заполненный кубами целых чисел от 10 до 20 можно так:

cubes = [i ** 3 for i in range(10, 21)]
4. Создать список, заполненный символами строки:

chars = [c for c in 'abcdefg']
print(chars)
Считывание входных данных
При решении многих задач из предыдущих уроков мы считывали начальные данные (строки, числа) и заполняли ими список.
С помощью списочных выражений процесс заполнения списка можно заметно сократить.

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

n = int(input())
lines = [input() for _ in range(n)]
Можно опустить описание переменной n:

lines = [input() for _ in range(int(input()))]
Если требуется считать список чисел, то необходимо добавить преобразование типов:

numbers = [int(input()) for _ in range(int(input()))]
Обратите внимание, мы используем символ _ в качестве имени переменной цикла, поскольку она не используется.

Списочные выражения часто используются для инициализации списков. В Python не принято создавать пустые списки, а затем
заполнять их значениями, если можно этого избежать.

Условия в списочном выражении
В списочных выражениях можно использовать условный оператор. Например, если требуется создать список четных чисел
 от 0 до 20, то мы можем написать такой код:

evens = [i for i in range(21) if i % 2 == 0]
Важно: для того, чтобы получить список, состоящий из четных чисел, лучше использовать функцию range(0, 21, 2).
Предыдущий пример приведен для демонстрации возможности использования условий в списочных выражениях.

Вложенные циклы
В списочном выражении можно использовать вложенные циклы.

Следующий программный код:

numbers = [i * j for i in range(1, 5) for j in range(2)]
print(numbers)
выведет список:

[0, 1, 0, 2, 0, 3, 0, 4]
Такой код равнозначен следующему:

numbers = []

for i in range(1, 5):
    for j in range(2):
        numbers.append(i * j)
print(numbers)
Подводя итог
Пусть word = 'Hello', numbers = [1, 14, 5, 9, 12], words = ['one', 'two', 'three', 'four', 'five', 'six'].

Списочное выражение	Результирующий список
[0 for i in range(10)]	[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[i ** 2 for i in range(1, 8)]	[1, 4, 9, 16, 25, 36, 49]
[i * 10 for i in numbers]	[10, 140, 50, 90, 120]
[c * 2 for c in word]	['HH', 'ee', 'll', 'll', 'oo']
[m[0] for m in words]	['o', 't', 't', 'f', 'f', 's']
[i for i in numbers if i < 10]	[1, 5, 9]
[m[0] for m in words if len(m) == 3]	['o', 't', 's']'''
'''Дополните приведенный код, используя списочное выражение, так чтобы получить новый список, содержащий строки 
исходного списка с удаленным первым символом.'''
# keywords = ['False', 'True', 'None', 'and', 'with', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del',
#             'elif', 'else', 'except', 'finally', 'try', 'for', 'from', 'global', 'if', 'import', 'in', 'is',
#             'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'while', 'yield']
#
# new_keywords = [m[1:] for m in keywords]
# print(new_keywords)
'''Дополните приведенный код, используя списочное выражение, так чтобы получить новый список, содержащий длины 
строк исходного списка.​'''
# keywords = ['False', 'True', 'None', 'and', 'with', 'as', 'assert', 'break', 'class', 'continue', 'def',
#             'del', 'elif', 'else', 'except', 'finally', 'try', 'for', 'from', 'global', 'if', 'import',
#             'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'while', 'yield']
#
# lengths = [len(m) for m in keywords]
#
# print(lengths)
# keywords = ['False', 'True', 'None', 'and', 'with', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif',
#             'else', 'except', 'finally', 'try', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda',
#             'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'while', 'yield']
#
# new_keywords = [m for m in keywords if len(m) >= 5]
#
# print(new_keywords)

#
'''Дополните приведенный код, используя списочное выражение, так чтобы получить список всех чисел палиндромов
 от 100 до 1000.'''
# new_keywords = [m for m in range(100, 1000) if m % 10 == m // 100]
#
# print(new_keywords)
'''Списочное выражение 1
На вход программе подается натуральное число nn. Напишите программу, использующую списочное выражение, которая 
создает список содержащий квадраты чисел от 11 до nn, а затем выводит его элементы построчно, то есть каждый 
на отдельной строке.
Формат входных данных
На вход программе подается натуральное число.
Формат выходных данных
Программа должна вывести текст в соответствии с условием задачи.
Примечание. Для вывода элементов списка используйте цикл for.'''
# n = int(input())
# s = [i ** 2 for i in range(1, n + 1)]
# print(*s, sep='\n')
'''Списочное выражение 2
На вход программе подается строка текста, содержащая целые числа. Напишите программу, использующую
 списочное выражение, которая выведет кубы указанных чисел также на одной строке.
Формат входных данных
На вход программе подается строка текста, содержащая целые числа, разделенные символом пробела.
Формат выходных данных
Программа должна вывести текст в соответствии с условием задачи.
Примечание 1. Для вывода элементов списка используйте цикл for.
Примечание 2. Используйте метод split().
'''
# n = input().split()
# s = [int(i) ** 3 for i in n]
# print(*s)
'''В одну строку 1
На вход программе подается строка текста, содержащая слова. Напишите программу, которая выводит слова
 введенной строки в столбик.
Формат входных данных
На вход программе подается строка текста, содержащая слова, разделенные символом пробела.
Формат выходных данных
Программа должна вывести текст в соответствии с условием задачи.
Примечание. Программу можно написать в одну строку кода.'''
# n = input().split()
# s = [i for i in n]
# print(*s, sep='\n')
'''В одну строку 2
На вход программе подается строка текста. Напишите программу, использующую списочное выражение, которая выводит
 все цифровые символы данной строки.
Формат входных данных
На вход программе подается строка текста.
Формат выходных данных
Программа должна вывести текст в соответствии с условием задачи.
Примечание. Программу можно написать в одну строку кода.'''
# n = input()
# s = [i for i in n if '0' <= i <= '9']
# print(*s, sep='')
'''В одну строку 3
На вход программе подается строка текста, содержащая целые числа. Напишите программу, использующую списочное
 выражение, которая выведет квадраты четных чисел, которые не оканчиваются на цифру 4.
Формат входных данных
На вход программе подается строка текста, содержащая целые числа, разделенные символом пробела.
Формат выходных данных
Программа должна вывести текст в соответствии с условием задачи.
Примечание. Программу можно написать в одну строку кода.'''
# n = input().split()
# s = [int(i)**2 for i in n if int(i) % 2 == 0 and int(i)**2 % 10 != 4]
# print(*s)