Задачи на Python

Содержание
Введение
Написать часть слов в предложении наоборот
Сумма нечётных чисел в строке
Следующий полный квадрат
Рост населения города
Валидация телефонной книги
Похожие статьи

Введение

Написать слова длиннее четырёх символов наоборот

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

Решение

С помощью абстракции списка

def spin_words(sentence): ns = sentence.split(" ") return " ".join([word[::-1] if len(word) > 4 else word for word in ns])

Без абстракции списка

def spin_words2(sentence): ns = sentence.split(" ") new_list = [] for word in ns: if len(word) > 4: new_list.append(word[::-1]) else: new_list.append(word) return " ".join(new_list)

С помощью лямбда функции и функции map()

def spin_words3(sentence): ns = sentence.split(" ") return " ".join(map(lambda w: w[::-1] if (len(w) > 4) else w, ns))

РЕКЛАМА хостинга Beget, которым я пользуюсь более десяти лет

Изображение баннера

Конец рекламы хостинга Beget, который я всем рекомендую.

Сумма нечётных чисел в строке

Вычислить сумму нечётных чисел в строке треугольника.

1 3 5 7 9 11 13 15 17 19 21 23 25 27 29

Пример: сумма во второй строке = 3 + 5 = 8.

Решение

Сперва можно решить задачу "в лоб"

def row_sum_odd_numbers(n): solved = False i = 0 value = 1 s = 0 while not solved: i += 1 l = [] for j in range(i): l.append(value) value +=2 print(l) if i == n: for num in l: s += num print("sum is: ", s) return s solved = True if __name__ == "__main__": row_sum_odd_numbers(3)

Если внимательно присмотреться к треугольнику, видно, что сумма чисел в строке это номер строки в кубе

def row_sum_odd_numbers(n): return n**3

Следующий полный квадрат

Вычислить следующий полный квадрат. Функция получает число, если оно является полным квадратом - нужно вернуть следующий. Если нет, вернуть -1

Пример: 9 -> 16, 121 -> 144

Решение

import math def find_next_square(sq): root = math.sqrt(sq) if root.is_integer(): return (root + 1)**2 else: return -1

Рост населения города

Задаётся начальное население, естественный прирост в год в процентах, прирост за счёт переехавших, желаемое население.

Вычислить, за сколько лет население достигнет желаемого.

Пример: 1000, 0, 50, 1100 -> 2 года

Решение

Главное не забывать округлять вниз при вычислении процентов.

import math def nb_year(p0, percent, aug, p): n = 0 while p0 < p: n += 1 p0 = math.floor(p0 * (1 + percent/100)) + aug print("p0: ",p0) print(p) print(n) return n if __name__ == "__main__": # nb_year(100, 3, 20, 1500) nb_year(1000, 2, 50, 1214)

Валидация телефонной книги

Есть словарь вида имя:номер

Нужно проверить, что ни один номер не является префиксом другого. Если номера одинаковые - это тоже неправильно.

pb1 = {"Alex": "123", "Boris": "1234", "Captain":"345467"} def is_consistent(book): for name1, number1 in book.items(): print(f"\nvalidating step {name1}, {number1}") for name2, number2 in book.items(): print(f"____validating substep {name2}, {number2}") if name1 == name2: print(f"____skipping same name {name1} and {name2}") continue if number1.startswith(number2): return False return True if __name__ == "__main__": print(is_consistent(pb1))

validating step Alex, 123 ____validating substep Alex, 123 ____skipping same name Alex and Alex ____validating substep Boris, 1234 ____validating substep Captain, 345467 validating step Boris, 1234 ____validating substep Alex, 123 False

Убедимся, что если префикс идёт позже валидация не пройдёт. Тажкже проверим одинаковый номер и убедимся, что если всё в порядке - валидация возвращает True.

pb1 = {"Alex": "123", "Boris": "1234", "Captain":"345467"} pb2 = {"Alex": "1234", "Boris": "123", "Captain": "345467"} pb3 = {"Alex": "1234", "Boris": "321", "Captain": "321"} pb4 = {"Alex": "1234", "Boris": "56", "Captain": "789"} def is_consistent(book): for name1, number1 in book.items(): for name2, number2 in book.items(): if name1 == name2: continue if number1.startswith(number2): return False return True if __name__ == "__main__": print(is_consistent(pb1)) print(is_consistent(pb2)) print(is_consistent(pb3)) print(is_consistent(pb4))

False False False True

Не будем пробегать одни и те же пары по два раза:

pb1 = {"Alex": "123", "Boris": "1234", "Captain":"345467"} def is_consistent(book): numbers = list(book.values()) for i, n1 in enumerate(numbers): print(f"\nvalidating step {i}, {n1}") for n2 in numbers[i + 1:]: print(f"____validating substep {n2}") if n1.startswith(n2) or n2.startswith(n1): return False return True if __name__ == "__main__": print(is_consistent(pb1))

validating step 0, 123 ____validating substep 1234 False

Ускорим наш алгоритм с помощью сортировки. Отсортируем все номера и будем сравнивать между собой только соседние.

Так как номера записаны как строки - номер и его префикс будут рядом.

pb = {"Alex": "1234", "Boris": "56", "Captain": "789", "Cleaning": "8387"} def is_consistent(book): numbers = sorted(book.values()) print(numbers) print(list(zip(numbers, numbers[1:]))) for n1, n2 in zip(numbers, numbers[1:]): print(f"____{n1}, {n2}") if n2.startswith(n1): return False return True if __name__ == "__main__": print(is_consistent(pb))

['1234', '56', '789', '8387'] [('1234', '56'), ('56', '789'), ('789', '8387')] ____1234, 56 ____56, 789 ____789, 8387 True

Автор статьи: Андрей Олегович

Похожие статьи
Задачи про списки
Списки []
list comprehension: Абстракция списка
Python
if, elif, else
Циклы
Абстракция множеств и словарей

Поиск по сайту

Подпишитесь на Telegram канал @aofeed чтобы следить за выходом новых статей и обновлением старых

Перейти на канал

@aofeed

Задать вопрос в Телеграм-группе

@aofeedchat

Контакты и сотрудничество:
Рекомендую наш хостинг beget.ru
Пишите на info@urn.su если Вы:
1. Хотите написать статью для нашего сайта или перевести статью на свой родной язык.
2. Хотите разместить на сайте рекламу, подходящую по тематике.
3. Реклама на моём сайте имеет максимальный уровень цензуры. Если Вы увидели рекламный блок недопустимый для просмотра детьми школьного возраста, вызывающий шок или вводящий в заблуждение - пожалуйста свяжитесь с нами по электронной почте
4. Нашли на сайте ошибку, неточности, баг и т.д. ... .......
5. Статьи можно расшарить в соцсетях, нажав на иконку сети: