<jupyter_start><jupyter_text>Центр непрерывного образования Программа «Python для автоматизации и анализа данных»Неделя 2 - 1*<NAME>, НИУ ВШЭ*   Срезы. Метод строк find() Строки, кортежи и списки представляют собой последовательности, а это значит, что мы можем обратиться к любому их элементу по индексу.Для выполнения такой операции в питоне используются квадратные скобки [] после объекта. В квадратных скобках указывается желаемый индекс. Индексирование начинается с 0.<jupyter_code>s = 'Welcome to "Brasil!"' # заодно обратите внимание на кавычки внутри кавычек (используем разные типы)
print(s)

print(s[0]) # первый элемент
print(s[1]) # второй
print(s[2]) # третий
print(s[-1]) # последний
print(s[-2]) # второй с конца

#Предыдущие действия никак не изменили строку
print(s)<jupyter_output>Welcome to "Brasil!"
W
e
l
"
!
Welcome to "Brasil!"<jupyter_text>Кроме выбора одного элемента с помощью индексирования можно получить подстроку. Для этого надо указать индексы границ подстроки через двоеточие. Первое число - от какого индекса начинаем (если здесь ничего не написать, то начнем сначала). Второе число (после первого двоеточия) - каким индексом заканчивается срез (если ничего не написать, то питон возьмет последний символ). Третье число (необязательное, после второго двоеточия) - шаг, по умолчанию там стоит 1 (каждая буква).Таким образом, использовав одно число без двоеточий, мы получим один символ. Использовав два числа через двоеточие - срез строки, включая первый индекс и не включая второй (первое число обязательно меньше второго). Использовав три числа через два двоеточих - срез строки с определенным шагом, заданным третьим числом.<jupyter_code>print(s[1:])
print(s[:4]) # четыре первых символа до порядкового номера 4
print(s[:]) # копия строки
print(s[:-1]) # вся строка кроме последнего символа
print(s[::2]) # также можно выбирать символы из строки с каким-то шагом
print(s[::-1]) # например, с помощью шага -1 можно получить строку наоборот<jupyter_output>elcome to "Brasil!"
Welc
Welcome to "Brasil!"
Welcome to "Brasil!
Wloet Bai!
"!lisarB" ot emocleW<jupyter_text>По аналогии со строками, у списков и кортежей тоже можно брать срезы.<jupyter_code>myList = [0, 1, 2, 3, 4, 5]
myTuple = (0, 1, 2, 3, 4, 5)
print(myList[1:]) # берем все, начиная с элемента с первым индексом
print(myTuple[2:])
print(myList[:3]) # берем все до элемента с третьим индексом (невключительно)
print(myTuple[:-1])
print(myList[::2]) # берем все четные элементы
print(myTuple[1::2]) # берем все нечетные элементы<jupyter_output>[0, 2, 4]
(1, 3, 5)<jupyter_text>Метод .find()Когда мы работаем со строками, у нас часто стоит задача брать срез не с конкретного индекса, а привязывать его к поиску определенного символа. У нас есть специальный метод строковых переменных .find().Методы - это методы классы. Грубо говоря, это функции, которые будут работать только с определенным типом данных. Синтаксис метода следующий: `{название переменной или данные}.{название метода()}`.Например, давайте проверим содержит ли строка упоминание университета.<jupyter_code>'В ВШЭ стартовала новая программа по Data Science'.find('ВШЭ')<jupyter_output><empty_output><jupyter_text>Метод .find() берет один аргумент - подстроку, которую ищет в строке. Возвращает метод индекс первого символа подстроки, если ее удалось найти.Если подстрока не была найдена, метод вернет -1 (на следующем занятии мы будем использовать это свойство, когда разберемся с условным оператором).<jupyter_code>'В ВШЭ стартовала новая программа по Data Science'.find('вшэ') # обратите внимание, метод чувствителен к регистру<jupyter_output><empty_output><jupyter_text>.find() иногда используется в парсинге веб-страниц. Зная индекс первого элемента, мы можем достать интересующую нас информацию.Например, мы скачали с сайта информацию о цене нового планшета и хотим достать оттуда собственно цену. Мы знаем, что цена идет после подстроки "ЦЕНА:" и что после самой цены идет постфикс "руб.". Давайте попробуем достать цену и посчитать, сколько стоит два таких планшета.<jupyter_code>info = 'iPad 64 GB ЦЕНА: 39 990 руб. Скидка: 5%'
print(info.find('ЦЕНА:')) # нашли индекс Ц - начала подстроки "ЦЕНА:"
print(info.find('руб.')) # нашли индекс р
price = info[info.find('ЦЕНА:')+6:info.find('руб.')-1] # вывели срез от от начала до конца цены (с помощью
                                               # слогаемых 6 и -1 откорретировали индексы до начала и конца цены)
print(price)<jupyter_output>11
24
39 990<jupyter_text>Почти готово, но теперь мешается пробел. Кстати, это очень частая проблема, что числа в интернете оформлены с разделителями и перед конвертацией их приходится еще и приводить к стандартному виду, который можно скормить функции int(). Пока мы не знаем метода, который может заменять символы, поэтому давайте попробуем почистить цену с помощью .find() и срезов.<jupyter_code>price_clean = price[:price.find(' ')]+price[price.find(' ')+1:]
print(price_clean)<jupyter_output>39990<jupyter_text>Теперь с этим можно работать!<jupyter_code>print(int(price_clean) * 2)<jupyter_output>79980<jupyter_text>Если подстрока входит в строку несколько раз, то find() вернет индекс только для первого вхождения.<jupyter_code>price.find('9')<jupyter_output><empty_output><jupyter_text>Есть модификация метода find(): rfind(substring) - возвращает позицию самого правого вхождения подстроки substring в строку string или -1, если подстрока не найдена.<jupyter_code>price.rfind('9')<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.08896602119108513, 'fraction_numerical': 0.014249177932042383, 'mean_word_length': 5.826683291770574, 'pattern_counts': {'":': 0, '<': 36, '<?xml version=': 0, '>': 36, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '10', 'dir': 'jupyter-structured-clean-dedup', 'id': '183126', 'license': 'MIT', 'n_tokens_mistral': 2299, 'n_tokens_neox': 2683, 'n_words': 639, 'path': 'lect2/Slices.ipynb', 'repo_name': 'oksizem/DPO_Python-2021-2022', 'size': '5483'}