Напиши программу, которая печатает список. Первый элемент списка — 1 буква 'а', последний — 33 буквы 'я'. Используй метод append().
В русском алфавите 33 буквы. Каждую нужно вывести в списке такое количество раз, которое соответствует её позиции.
Python
Первый элемент списка — 1 буква 'а', последний — 33 буквы 'я'. Используй метод append().
Аппенд здесь нужен только дилетантам, умеющим генерировать лишь неполные решения проблем. А код должен быть совершенным во всём.
Вот, например, небольшой шажок в нужную сторону:
Список можно заменить на итератор, создаваемый функцией chain:
И ещё один шажок: зачем нам списочные выражения, когда можно написать простенький морфизм:
Всё же, кое-что в этом решении - лишнее: двойной вызов char_range. Мы же не хотим дублирования кода? Вот вариант, в котором ни один элемент прикладной логики не дублируется:
И наконец, можно избавиться от starmap:
Вот, например, небольшой шажок в нужную сторону:
def char_range(s, e): return map(chr, range(ord(s), ord(e) + 1))
alpha = sum((list(char_range('а', 'е')), ['ё'], list(char_range('ж', 'я'))), [])
print(*(c * i for i, c in enumerate(alpha, 1)), sep = '\n')
Но здесь плохо то, что материализуется список букв, который не нужен, пробег же выполняется один раз.Список можно заменить на итератор, создаваемый функцией chain:
from itertools import chain
def char_range(s, e): return map(chr, range(ord(s), ord(e) + 1))
alpha = chain.from_iterable((char_range('а', 'е'), ('ё',), char_range('ж', 'я')))
print(*(c * i for i, c in enumerate(alpha, 1)), sep = '\n')
И ещё один шажок: зачем нам списочные выражения, когда можно написать простенький морфизм:
from itertools import chain, starmap
def char_range(s, e): return map(chr, range(ord(s), ord(e) + 1))
alpha = chain.from_iterable((char_range('а', 'е'), ('ё',), char_range('ж', 'я')))
print(*starmap(str.__mul__, map(reversed, enumerate(alpha, 1))), sep = '\n')
Всё же, кое-что в этом решении - лишнее: двойной вызов char_range. Мы же не хотим дублирования кода? Вот вариант, в котором ни один элемент прикладной логики не дублируется:
from itertools import chain, starmap
def char_range(s, e): return map(chr, range(ord(s), ord(e) + 1))
alpha = chain.from_iterable(starmap(char_range, (('а', 'е'), ('ё',) * 2, ('ж', 'я'))))
print(*starmap(str.__mul__, map(reversed, enumerate(alpha, 1))), sep = '\n')
Правда, тут лишний раз вызывается char_range, но средний вызов вернёт пустой итератор, так что это - не проблема.И наконец, можно избавиться от starmap:
from itertools import chain, count
def char_range(s, e): return map(chr, range(ord(s), ord(e) + 1))
alpha = chain.from_iterable(map(char_range, ('а', 'ё', 'ж'), ('е', 'ё', 'я')))
print(*map(str.__mul__, alpha, count(1)), sep = '\n')
# в ord (номер символа в таблице Юникода) буква "ё" идет не в общем порядке, а отдельно,
# так что количество букв "я" будет не 33, а 32
res = []
n = ord('а')
for i in range(1,33):
res.append(chr(n) * i)
n += 1
print(res))
Киселев Евгений
не выводит букву ё
Похожие вопросы
- Cannot import name 'XXX' from 'XXXXX' ошибка возникает как исправить?
- На входе строка s = '3' + n * '5'. В конце сумма её цифр должна быть равна 27. Как преобразовать эту строку в число?
- Сумма индексов элементов списка
- Как решить задачу без написания 999 элементов списка?
- Написать программу, которая находит произведение элементов списка, находящихся на нечетных позициях.
- Найти сумму n-го количества элементов ряда 1, -0.5, 0.25, -0.125, …
- Программирование питона. Найди количество элементов в данном списке
- Как в python получить элемент из списка по нескольким значениям
- Как запретить пользователю ввод букв или цифр в python
- Дан список чисел. Нужно посчитать количество их "пар" (т.е. "1 1 1 1 1" = 10, "1 2 3 2 3" = 2 и т.д.) (Python)