Задачи на 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))
Сумма нечётных чисел в строке
Вычислить сумму нечётных чисел в строке треугольника.
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 | |
| Циклы | |
| Абстракция множеств и словарей |