Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву
Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Методы split и join для списка строк в PythonСодержание книги
Поиск на нашем сайте
Если элементы списка вводяться в одной строке, разделенные пробелами, то функция input() не поможет разделить строку на слова. В этом случае строку можно считать функцией input(), после этого использовать метод строки split(), возвращающий список строк, разрезав исходную строку на части по пробелам. Пример: A = input().split() Если при запуске этой программы ввести строку 1 2 3, то список A будет равен [‘1’, ‘2’, ‘3’]. Обратите внимание, что список будет состоять из строк, а не из чисел. Если хочется получить список именно из чисел, то можно затем элементы списка по одному преобразовать в числа: for i in range(len(A)): A[i] = int(A[i]) Используя функции языка map и list то же самое можно сделать в одну строку: A = list(map(int, input().split())) Если нужно считать список действительных чисел, то нужно заменить тип int на тип float. У метода split есть необязательный параметр, который определяет, какая строка будет использоваться в качестве разделителя между элементами списка. Например, метод split(‘.’) вернет список, полученный разрезанием исходной строки по символам ‘.’. A = ['red', 'green', 'blue'] print(' '.join(A)) print(''.join(A)) print('***'.join(A)) выведет строки ‘red green blue’, redgreenblue и red***green***blue. Если же список состоит из чисел, то придется использовать еще и функцию map. То есть вывести элементы списка чисел, разделяя их пробелами, можно так: print(' '.join(map(str, A))) Списки в Python Большинство программ работает не с отдельными переменными, а с набором переменных. Например, программа может обрабатывать информацию об учащихся класса, считывая список учащихся с клавиатуры или из файла, при этом изменение количества учащихся в классе не должно требовать модификации исходного кода программы. Раньше мы сталкивались с задачей обработки элементов последовательности, например, вычисляя наибольший элемент последовательности. Но при этом мы не сохраняли всю последовательность в памяти компьютера, однако, во многих задачах нужно именно сохранять всю последовательность, например, если бы нам требовалось вывести все элементы последовательности в возрастающем порядке (“отсортировать последовательность”). Для хранения таких данных можно использовать структуру данных, называемую в Питоне список (в большинстве же языков программирования используется другой термин “массив”). Список представляет собой последовательность элементов, пронумерованных от 0, как символы в строке. Список можно задать перечислением элементов списка в квадратных скобках, например, список можно задать так: Primes = [2, 3, 5, 7, 11, 13] Rainbow = ['Red', 'Orange', 'Yellow', 'Green', 'Blue', 'Indigo', 'Violet'] В списке Primes — 6 элементов, а именно, Primes[0] == 2, Primes[1] == 3, Primes[2] == 5, Primes[3] == 7, Primes[4] == 11, Primes[5] == 13. Список Rainbow состоит из 7 элементов, каждый из которых является строкой. Также как и символы строки, элементы списка можно индексировать отрицательными числами с конца, например, Primes[-1] == 13, Primes[-6] == 2. Длину списка, то есть количество элементов в нем, можно узнать при помощи функции len, например, len(A) == 6. Рассмотрим несколько способов создания и считывания списков. Прежде всего можно создать пустой список (не содержащий элементов, длины 0), в конец списка можно добавлять элементы при помощи метода append. Например, если программа получает на вход количество элементов в списке n, а потом n элементов списка по одному в отдельной строке, то организовать считывание списка можно так: A = [] for i in range(int(input()): A.append(int(input()) В этом примере создается пустой список, далее считывается количество элементов в списке, затем по одному считываются элементы списка и добавляются в его конец. Для списков целиком определены следующие операции: конкатенация списков (добавление одного списка в конец другого) и повторение списков (умножение списка на число). Например: A = [1, 2, 3] B = [4, 5] C = A + B D = B * 3 В результате список C будет равен [1, 2, 3, 4, 5], а список D будет равен [4, 5, 4, 5, 4, 5]. Это позволяет по-другому организовать процесс считывания списков: сначала считать размер списка и создать список из нужного числа элементов, затем организовать цикл по переменной i начиная с числа 0 и внутри цикла считывается i-й элемент списка: A = [0] * int(input()) for i in range(len(A)): A[i] = int(input()) Вывести элементы списка A можно одной инструкцией print(A), при этом будут выведены квадратные скобки вокруг элементов списка и запятые между элементами списка. Такой вывод неудобен, чаще требуется просто вывести все элементы списка в одну строку или по одному элементу в строке. Приведем два примера, также отличающиеся организацией цикла: for i in range(len(A)): print(A[i]) Здесь в цикле меняется индекс элемента i, затем выводится элемент списка с индексом i. for elem in A: print(elem, end = ' ') В этом примере элементы списка выводятся в одну строку, разделенные пробелом, при этом в цикле меняется не индекс элемента списка, а само значение переменной (например, в цикле for elem in [‘red’, ‘green’, ‘blue’] переменная elem будет последовательно принимать значения ‘red’, ‘green’, ‘blue’. Обращение массива Для того, чтобы переставить элементы массива A длины N в обратном порядке, нужно разбить из на пары первый--последний, второй--предпоследний и т. д. и поменять местами элементы в каждой паре. При этом нужно обратить внимание, что пар не N, а [N/2]. ПРИМЕР КОДА НА ЯЗЫКЕ PYTHON for i in range(len(A) // 2):
На языке питон можно сделать то же самое короче, воспользовавшись срезами списков: Циклический сдвиг в массиве Сдвиг на k элементов влево: A = A[k:] + A[:k] Сдвиг на k элементов вправо: A = A[-k:] + A[:-k]
Такой сдвиг требует дополнительную память для хранения срезов, пропорциональную длине массива. Срезы списков в Python Со списками, так же как и со строками, можно делать срезы. А именно: A[i:j] срез из j-i элементов A[i], A[i+1], …, A[j-1]. A[i:j:-1] срез из i-j элементов A[i], A[i-1], …, A[j+1] (то есть меняется порядок элементов). A[i:j:k] срез с шагом k: A[i], A[i+k], A[i+2*k],…. Если значение k<0, то элементы идут в противоположном порядке. Каждое из чисел i или j может отсутствовать, что означает “начало строки” или “конец строки” Списки, в отличии от строк, являются изменяемыми объектами: можно отдельному элементу списка присвоить новое значение. Но можно менять и целиком срезы. Например: A = [1, 2, 3, 4, 5] A[2:4] = [7, 8, 9] Получится список, у которого вместо двух элементов среза A[2:4] вставлен новый список уже из трех элементов. Теперь список стал равен [1, 2, 3, 7, 8, 9, 5]. A = [1, 2, 3, 4, 5, 6, 7] A[::-2] = [10, 20, 30, 40] Получится список [40, 2, 30, 4, 20, 6, 10]. Здесь A[::-2] — это список из элементов A[-1], A[-3], A[-5], A[-7], которым присваиваются значения 10, 20, 30, 40 соответственно. Если не непрерывному срезу (то есть срезу с шагом k, отличному от 1), присвоить новое значение, то количество элементов в старом и новом срезе обязательно должно совпадать, в противном случае произойдет ошибка ValueError. Для непрерывных срезов количество элементов может не совпадать, что привет к добавлению элементов в середину списка или удалению элементов из середины. Это может быть затратной по времени операцией, если для вставки или удаления необходимо переместить в памяти значительное количество элементов. Обратите внимание, A[i] — это операция обращения к одному элементу списка, а не к срезу! Операции со списками в Python
Сортировка выбором Сортировка массива выбором осуществляется так: 1. находим номер минимального значения в неотсортированной части массива; 2. производим обмен этого значения со значением первой неотсортированной позиции (обмен не нужен, если минимальный элемент уже находится на данной позиции); 3. продолжаем сортировку оставшегося списка, исключив из рассмотрения еще один элемент. ПРИМЕР СОРТИРОВКИ ВЫБОРОМ МИНИМУМА НА СИ void choiseSortFunction(double A[], size_t N)
ПРИМЕР СОРТИРОВКИ ВЫБОРОМ МИНИМУМА НА PYTHON def SelectionSort(A): Можно модифицировать алгоритм — не сохранять индекс наименьшего из просмотренных элементов, а при просмотре элементов в срезе A[i:] обменивать очередной элемент A[j] местами с A[i], если A[j]<A[i]: def SelectionSort(A):
ПРИМЕР СОРТИРОВКИ ВЫБОРОМ МИНИМУМА НА PASCAL var a: array[1..1000] of longint; tmp_num, i, j, n, tmp: longint; begin readln(n); for i:= 1 to n do read(a[i]); for i:= 1 to n - 1 do begin // n-1 раз проходимся по массиву, ставя "на место" очередной элемент tmp_num:= i; //номер минимального среди элементов с индексами от i до n for j:= i + 1 to n do if a[j] < a[tmp_num] then tmp_num:= i; swap(a[i], a[tmp_num]); //ставим найденный минимальный "на место" end; for i:= 1 to n do write(a[i], ' '); end.
Сортировка вставками Сортировка вставками использует такой инвариант: первые элементы списка, то есть срез A[:i] уже отсортирован. А вот как устроен алгоритм добавления i-го элемента к уже отсортированной части. Здесь берется элемент A[i] и добавляется к уже отсортированной части списка. Например, пусть i = 5 и срез A[:i] = [1, 4, 6, 8, 8], а значение A[i] == 5. Тогда элемент A[i] == 5 нужно поставить после элемента A[1] == 4, а все элементы, которые больше 5, сдвинуть вправо на 1. Получится cрез A[:i + 1] = [1, 4, 5, 6, 8, 8]. Таким образом, при вставке элемента A[i] в срез A[:i] так, чтобы в результате получился упорядоченный срез, все элементы, которые больше A[i] будут двигаться вправо на одну позицию. А в освободившуюся позицию и будет вставлен элемент A[i]. Получаем следующий алгоритм: def InsertionSort(A): Посчитаем сложность алгоритма сортировки вставками. Следует отметить, что если массив уже упорядочен, то все элементы останутся на своем месте и вложенный цикл не будет выполнен ни разу. В этом случае сложность алгоритма сортировки вставками — линейная, т. е. O(n). Аналогично, если массив «почти упорядочен», то есть для превращения его в упорядоченный нужно поменять местами несколько соседних или близких элементов, то сложность также будет линейной.
Сортировка методом пузырька Перед тем, как излагать этот метод сортировки, внимательно прислушаемся к одному небольшому примечанию. Массив упорядочен по возрастанию, если меньшие числа в нем стоят раньше больших. Чем меньше число, тем раньше оно должно стоять в массиве, чем больше число — тем позже. Другими словами, чем больше число, тем больше его номер в массиве (индекс). Если мы последовательно рассмотрим все пары соседних чисел, и в каждой из них это свойство выполняется, то массив можно считать упорядоченным. Именно на этом и базируется основная идея сортировки методом пузырька (также называемого методом обмена). Будем сравнивать пары соседних элементов массива. Если в какой-то паре большее число стоит левее меньшего, то их надо поменять местами. Рассмотрим работу метода на примере. Пусть дан массив из 6 целых чисел, которые необходимо расположить в порядке возрастания. 4 3 5 8 6 2 Двигаться будем слева направо (хотя это не принципиально). Шаг 1. Сравним 4 и 3. Число 4 больше (а значит должно стоять правее) - меняем местами эти элементы. Новый массив: 3 4 5 8 6 2 Независимо от того, меняли мы местами элементы или нет — просто переходим к следующей паре. Шаг 2. Сравним 4 и 5. Числа в паре стоят в «правильном» порядке — меньшее левее большего. Ничего не делаем с этими элементами. Массив остается: 4 3 5 8 6 2 Переходим к следующей паре. Шаг 3. Сравниваем 5 и 8. Эти числа также стоят в «правильном» порядке, поэтому массив не изменяется: 4 3 5 8 6 2 Берем следующую пару. Шаг 4. Сравниваем 8 и 6. Здесь большее число стоит левее меньшего, поэтому меняем числа местами, получаем новый массив: 4 3 5 6 8 2 Переходим к следующей паре. Шаг 5. Сравниваем 8 и 2.Опять большее число левее меньшего — переставляем числа. 4 3 5 6 2 8 Пары закончились. Правда, массив пока мало похож на отсортированный. Однако, можно сделать одно важное наблюдение: после полного прохода по массиву хотя бы одно число (а именно – самое большое) будет поставлено на свое место. Именно поэтому этот метод носит название «метод пузырька» или просто «пузырек». Наибольшее число, как пузырек из глубины стакана с газировкой, «всплывает» на поверхность (на последнее место в массиве) и остается там. Теперь, если мы сделаем второй проход по массиву, то еще одно число встанет на свое место (а может быть и не одно, но об этом чуть позже). Значит, чтобы гарантированно получить отсортированный массив, надо сделать столько проходов, сколько элементов в массиве. Впрочем, достаточно сделать N−1 проход, потому что когда все числа кроме одного будут на своих местах, последнее тоже само собой окажется на своем месте. Итак, мы выяснили, что для успешной сортировки надо сделать N−1 проход, по N−1 сравнению на каждом проходе. Таким образом структура программы — двойной цикл. Внешний цикл — по количеству проходов, внутренний — по тем парам элементов, которые мы сравниваем.
|
||||||||||||||||||||||||
|
Последнее изменение этой страницы: 2017-02-19; просмотров: 1745; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.216.42 (0.01 с.) |