Сборник. Сборник упражнений
Скачать 1.68 Mb.
|
232 Решения if s[len(s) – 1] != t[len(t) – 1]: cost = 1 # Рассчитываем три расстояния d1 = editDistance(s[0 : len(s) – 1], t) + 1 d2 = editDistance(s, t[0 : len(t) – 1]) + 1 d3 = editDistance(s[0 : len(s) – 1] , t[0 : len(t) – 1]) + \ cost # Возвращаем минимальное return min(d1, d2, d3) # Рассчитываем редакционное расстояние между двумя строками, введенными пользователем def main(): # Запрашиваем у пользователя две строки s1 = input("Введите строку: ") s2 = input("Введите другую строку: ") # Рассчитываем и отображаем редакционное расстояние print("Редакционное расстояние между %s и %s равно %d." % \ (s1, s2, editDistance(s1, s2))) # Вызов основной функции main() Упражнение 183. Последовательность химических элементов ## # Определяем максимально продолжительную последовательность химических элементов, # в которой следующий элемент начинается на последнюю букву предыдущего # ELEMENTS_FNAME = "../Data/Elements.csv" ## Определяем максимально продолжительную последовательность химических элементов, # в которой следующий элемент начинается на последнюю букву предыдущего # @param start – первое слово в последовательности # @param words – список слов, которые могут появляться в последовательности # @return максимальная по длине последовательность слов def longestSequence(start, words): # Базовый случай: Если start пустая, то и список слов пустой if start == "": return [] # Находим самый длинный список слов, проверяя все слова, которые могут # появиться в последовательности best = [] last_letter = start[len(start) – 1].lower() for i in range(0, len(words)): Рекурсия 233 first_letter = words[i][0].lower() # Если первая буква следующего слова совпадает с последней буквой предыдущего if first_letter == last_letter: # Используем рекурсию для поиска последовательности–кандидата candidate = longestSequence(words[i], \ words[0 : i] + words[i + 1 : len(words)]) # Сохраняем последовательность, если она лучшая на данный момент if len(candidate) > len(best): best = candidate # Возвращаем лучшую последовательность с первым словом в начале return [start] + best ## Загружаем все элементы из файла # @return список всех элементов def loadNames(): names = [] # Открываем файл с набором данных inf = open(ELEMENTS_FNAME, "r") # Загружаем построчно в список элементов for line in inf: line = line.rstrip() parts = line.split(",") names.append(parts[2]) # Закрываем файл и возвращаем список inf.close() return names # Отображаем самую длинную последовательность, начинающуюся со введенного # пользователем элемента def main(): # Загружаем имена элементов в список names = loadNames() # Считываем первый элемент и делаем первую букву заглавной start = input("Введите название элемента: ") start = start.capitalize() # Проверяем, что пользователь ввел правильный элемент if start in names: # Удаляем первый элемент из списка names.remove(start) # Находим самую длинную последовательность sequence = longestSequence(start, names) # Отображаем последовательность элементов 234 Решения print("Самая длинная последовательность, начинающаяся с", start, ", это:") for element in sequence: print(" ", element) else: print("Извините, вы ввели неправильный элемент.") # Вызов основной функции main() Упражнение 184. Выравниваем список ## # Используя рекурсию, выравниваем список с вложенными элементами # ## Удаляем все иерархии внутри списка # @param data – список для выравнивания # @return выровненная версия списка def flatten(data): # Если список пустой, делать нечего if data == []: return [] # Если первый элемент списка – список if type(data[0]) == list: # Выравниваем первый элемент и остальные return flatten(data[0]) + flatten(data[1:]) else: # Первый элемент – не список, так что только остальные элементы нужно # выравнивать return [data[0]] + flatten(data[1:]) # Демонстрируем работу функции def main(): print(flatten([1, [2, 3], [4, [5, [6, 7]]], [[[8], 9], [10]]])) print(flatten([1, [2, [3, [4, [5, [6, [7, [8, [9, \ [10]]]]]]]]]])) print(flatten([[[[[[[[[[1], 2], 3], 4], 5], 6], 7], 8], 9], \ 10])) print(flatten([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])) print(flatten([])) # Вызов основной функции main() Упражнение 186. Кодирование на основе длин серий ## # Выполняем кодирование на основе длин серий для строк и списков # Рекурсия 235 ## Кодирование на основе длин серий для строк и списков # @param data – строка или список для кодирования # @return список, в котором на четных позициях располагаются значения, # а на нечетных – количество раз, которое должно повториться предшествующее значение def encode(data): # Если данных нет, нечего и кодировать if len(data) == 0: return [] Если бы мы задали условие data == "", то эта функция работала бы только для строк. Если data == [], то только для списков. Проверка длины списка len(data) == 0 по- зволяет обеспечить правильную работу функции как для строк, так и для списков. # Находим индекс первого элемента, отличного от элемента с индексом 0 index = 1 while index < len(data) and data[index] == data[index – 1]: index = index + 1 # Кодируем группу символов current = [data[0], index] # Используем рекурсию для обработки символов от index до конца строки return current + encode(data[index : len(data)]) # Демонстрируем работу функции кодирования def main(): # Запрашиваем строку у пользователя s = input("Введите строку символов: ") # Отображаем результат print("При использовании кодирования на основе длин серий " \ "результат будет следующим:", encode(s)) # Вызов основной функции main() Б Булевы выражения, 41 Булевы операторы, 41 В Вложенные циклы, 59 Вложенные if, 40 И Инструкция def, 71 else, 38 if, 36 if-else, 38 return, 75 Исключения, 133 блок except, 133 блок try, 133 К Комментарии, 19 Конкатенация, 22 М Математические операторы, 15 возведение в степень, 15 вычисление остатка от деления, 15 вычитание, 15 деление, 15 деление без остатка, 15 сложение, 15 умножение, 15 Метод append, 93 close, 126 index, 96 pop, 94 read, 127 readline, 126 readlines, 127 remove, 94 reverse, 95 rstrip, 129 sort, 95 write, 130 Методы, 93 Модули, 18 О Оператор in, 96 П Пары ключ-значение, 112 Переменные, 14 локальные, 75 Получение символа из строки, 23 Р Рекурсия, 145 С Словари, 112 Спецификаторы формата, 19 Списки, 89 индексы, 90 элементы, 89 Срез, 23 Т Таблицы истинности, 41 Предметный указатель Предметный указатель 237 Ф Файлы двоичные, 125 режим доступа, 126 текстовые, 125 файловый объект, 126 Форматирующий оператор, 21 Функции, 15, 71 chr, 184 float, 16 input, 16 int, 16 len, 23, 91 open, 126 ord, 184 print, 17 range, 58 str, 130 аргументы, 72 вызов, 71 определение, 71 переменные параметров, 72 Ц Циклы for, 57 while, 56 Книги издательства «ДМК ПРЕСС» можно купить оптом и в розницу в книготорговой компании «Галактика» (представляет интересы издательств «ДМК ПРЕСС», «СОЛОН ПРЕСС», «КТК Галактика»). Адрес: г. Москва, пр. Андропова, 38; тел.: (499) 782-38-89, электронная почта: books@alians-kniga.ru. При оформлении заказа следует указать адрес (полностью), по которому должны быть высланы книги; фамилию, имя и отчество получателя. Желательно также указать свой телефон и электронный адрес. Эти книги вы можете заказать и в интернет-магазине: www.a-planeta.ru. Бен Стивенсон Python. Сборник упражнений Главный редактор Мовчан Д. А. Зам. главного редактора Сенченкова Е. А. dmkpress@gmail.com Перевод Гинько А. Ю. Корректор Синяева Г. И. Верстка Чаннова А. А. Дизайн обложки Мовчан А. Г. Гарнитура PT Serif. Печать цифровая. Усл. печ. л. 17,4. Тираж 200 экз. Веб-сайт издательства: www.dmkpress.com |