Добавил:
хачю сдать сессию Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

4. Методы split и join - Jupyter Notebook

.pdf
Скачиваний:
0
Добавлен:
09.07.2025
Размер:
359.4 Кб
Скачать

27.09.2022, 11:43

4. Методы split и join - Jupyter Notebook

Методы .split() и .join() , списковые включения

Метод .split()

Мы уже достаточно хорошо знакомы с вводом какой-то информации с клавиатуры с помощью input() . Однако раньше мы всегда вводили с клавиатуры только один объект: одно число или одно слово... А можно ли вводить сразу несколько слов или чисел? Конечно, можно! Посмотрим.

In [1]:

1 heroes = input("Введите имена героев мюзикла Notre Dame de Paris: ")

Введите имена героев мюзикла Notre Dame de Paris: Гренгуар Фролло Эсмеральда

Выше мы ввели довольно длинную строку: перечислили имена четырех героев через пробел. Посмотрим на нее.

In [2]:

1 heroes

Out[2]:

'Гренгуар Фролло Эсмеральда'

А теперь разобьем эту строку по пробелу, чтобы получить три отдельных имени ‒ воспользуемся методом .split() .

In [3]:

1 heroes_list = heroes.split() # по умолчанию деление по пробелу

2 heroes_list

Out[3]:

['Гренгуар', 'Фролло', 'Эсмеральда']

Получили самый обычный список. Можем обращаться к его элементам и даже изменять их при желании:

In [6]:

1 heroes_list[1]

Out[6]:

'Фролло'

Разбивать строку на части можно по любому символу, достаточно указать нужный символ в скобках в

.split() .

localhost:8888/notebooks/EXONTOOLS/2/Доп. занятия/4. Методы split и join.ipynb

1/7

27.09.2022, 11:43

4. Методы split и join - Jupyter Notebook

In [7]:

1 fheroes = input("Введите имена любимых героев NDDP через запятую: ")

Введите имена любимых героев NDDP через запятую: Фролло,Гренгуар

In [8]:

1 fheroes

Out[8]:

'Фролло,Гренгуар'

In [9]:

1 fheroes.split(",")

Out[9]:

['Фролло', 'Гренгуар']

Попробуем проделать то же самое, но для чисел.

In [10]:

1 nums = input("Введите два числа: ") 2 nums_list = nums.split()

Введите два числа: 1999 2022

Список получили, но он пока состоит из строк, не из чисел.

In [11]:

1 nums_list

Out[11]:

['1999', '2022']

Поправим: превратим все элементы списка в целые числа с помощью цикла и сохраним их в новый список.

In [12]:

1

final = []

2

 

 

3

for n in nums_list:

4

 

final.append(int(n))

5

final

 

 

Out[12]:

[1999,

2022]

localhost:8888/notebooks/EXONTOOLS/2/Доп. занятия/4. Методы split и join.ipynb

2/7

27.09.2022, 11:43

4. Методы split и join - Jupyter Notebook

Чуть позже мы узнаем, как более удобно (и что приятно, более быстро) сделать то же самое, но без цикла.

А пока узнаем, можно ли разбить строку по пустоте? То есть просто разделить ее на отдельные символы. Попробуем.

In [11]:

1 "1234".split("") # нельзя

---------------------------------------------------------------------------

ValueError Traceback (most recent call last) <ipython-input-11-ab6b88668550> in <module>()

----> 1 "1234".split("") # нельзя

ValueError: empty separator

Python сообщает нам, что разделитель пустой, и делить строку на части не хочет.

Раз есть метод для разбиения строки на список строк, должна быть и обратная операция ‒ для склеивания списка строк в одну большую строку. И такой метод действительно есть!

Метод .join()

Пусть у нас есть список, состоящий из имени и фамилии.

In [13]:

1l = ['Daniel', 'Lavoie']

Имы хотим элементы списка склеить в одну строку так, чтобы между именем и фамилией был пробел.

In [14]:

1 " ".join(l) # вуаля

Out[14]:

'Daniel Lavoie'

Могли бы вместо пробела в кавычках поставить любой символ, например, нижнее подчеркивание.

In [15]:

1 "_".join(l)

Out[15]:

'Daniel_Lavoie'

Важно: метод .join() берет в качестве аргумента именно список, не просто перечисленные элементы через запятую.

localhost:8888/notebooks/EXONTOOLS/2/Доп. занятия/4. Методы split и join.ipynb

3/7

27.09.2022, 11:43

4. Методы split и join - Jupyter Notebook

In [16]:

1 a = '7'

2 b = '8'

3

4 " ".join(a,b) # не работает

---------------------------------------------------------------------------

TypeError

Traceback (most recent call last)

<ipython-input-16-e664b268447f> in <module>

2

b

= '8'

3

 

".join(a,b) # не работает

----> 4

"

TypeError: join() takes exactly one argument (2 given)

In [11]:

1 " ".join([a,b]) # работает

Out[11]:

'7 8'

Иногда удобно сочетать методы .split() и .join() . Например, перед нами стоит такая задача. Пользователь вводит дату в формате день-месяц-год через точку, а мы хотим выводить на экран дату в том же формате, но через дефис. Чтобы решить эту задачу, можно взять введенную пользователем строку с датой, разбить ее по точке, а затем склеить части, но уже используя дефис.

In [17]:

1 date = input("Введите дату: ") 2 date

Введите дату: 27.09.2022

Out[17]:

'27.09.2022'

In [19]:

1 parts = date.split(".")

2 print(parts)

3 result = "-".join(parts)

4 print(result)

['27', '09', '2022'] 27-09-2022

Метод .strip()

При работе со строками можно столкнуться с еще одной сложностью ‒ с пробелами. Если мы попросим пользователя ввести имена героев через запятую, перед запятой он, скорее всего, поставит пробел.

localhost:8888/notebooks/EXONTOOLS/2/Доп. занятия/4. Методы split и join.ipynb

4/7

27.09.2022, 11:43

4. Методы split и join - Jupyter Notebook

In [20]:

1 # вот так

2

3 fheroes = input("Введите имена любимых героев NDDP через запятую: ") 4 fheroes

Введите имена любимых героев NDDP через запятую: Фролло, Гренгуар

Out[20]:

'Фролло, Гренгуар'

Как быть? Разбить строку по запятой, а потом избавиться от пробела. Избавиться от пробела поможет метод .strip() .

In [21]:

 

1

hero = "

Гренгуар"

2

hero.strip()

 

Out[21]:

'Гренгуар'

Метод .strip() работает по-умному: он убирает пробелы в начале и в конце строки, пробелы в середине (между словами) никуда не денутся.

In [23]:

 

 

 

 

1

heroes = "

Гренгуар

Фролло

"

2

heroes.strip()

 

 

 

Out[23]:

 

 

 

 

'Гренгуар

Фролло'

 

 

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

варианта со .strip() : .lstrip() , .rstrip() и

.strip() . Метод .lstrip() убирает все пробелы

в начале строки (слева, l ‒ от left), метод .rstrip()

‒ все пробелы в конце строки (справа, r ‒ от right),

а метод

.strip() является их объединением, то есть убирает все пробелы в начале и в конце строки.

In [24]:

 

 

 

 

1

"

Гренгуар ".lstrip()

 

 

 

 

 

Out[24]:

'Гренгуар '

localhost:8888/notebooks/EXONTOOLS/2/Доп. занятия/4. Методы split и join.ipynb

5/7

27.09.2022, 11:43

4. Методы split и join - Jupyter Notebook

In [25]:

1 " Гренгуар ".rstrip()

Out[25]:

'Гренгуар'

In [26]:

1 " Гренгуар ".strip()

Out[26]:

'Гренгуар'

Списковые включения

Сейчас мы познакомимся со списковыми включениями (list comprehensions) ‒ объектами, которые позволяют создавать новые списки на основе старых, без создания пустого списка и заполнения его в цикле. Чтобы понять, что такое списковые включения, лучше сначала посмотреть на пример. Попробуем создать список, состоящий из элементов другого списка, возведенных в квадрат.

In [27]:

 

1

 

old = [1, 0, 3,

5]

 

2

 

new = [i**2 for

i in old]

3

 

new

 

 

 

 

 

Out[27]:

[1, 0, 9, 25]

Цикл for у нас по-прежнему задействован, только немного в ином качестве и в другой последовательности: сначала мы указываем, что нужно делать с элементами, а потом ‒ по каким элементам будем пробегаться. В нашем примере мы говорим, что возводим элементы i в квадрат, а потом сообщаем, что эти элементы i мы берем из списка old .

Вернемся к примеру с числами, введенными с клавиатуры, и попробуем получить список из чисел, используя списковые включения.

In [28]:

1

snumbers = input("Введите числа через пробел: ")

2

lnumbers = snumbers.split()

3

 

4

numbers = [int(n) for n in lnumbers] # делаем все элементы целочисленными

5

numbers

 

 

Введите числа через пробел: 6 9 6 3

Out[28]:

[6, 9, 6, 3]

localhost:8888/notebooks/EXONTOOLS/2/Доп. занятия/4. Методы split и join.ipynb

6/7

27.09.2022, 11:43

4. Методы split и join - Jupyter Notebook

Использование списковых включений ‒ не только более компактный, но и более быстрый способ создания новых списков на основе старых. Давайте сравним время выполнения кода с циклом for и кода со списковыми включениями.

In [33]:

 

1

 

%%timeit

 

 

 

2

 

 

 

3

 

# timeit

- магическое слово Jupyter, magic command,

4

 

# которое позволяет измерить время исполнения ячейки с кодом

5

 

# ячейка

запускается много раз, и выводится среднее время выполнения со стандарным откл

6

 

# должно

быть указано первой строчкой в ячейке

7

 

 

 

8

 

L = []

 

9

 

for i in

range(1, 10001):

10

 

L.append(i**2)

 

 

 

 

5.4 ms ± 7.57 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [34]:

1

%%timeit

2

 

3

L = [j**2 for j in range(1, 10001)]

 

 

4.55 ms ± 18.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

Атеперь напишем компактный и быстрый код, который будет разбивать строку по запятой и при этом возвращать имена героев без лишних пробелов.

In [30]:

 

1

 

names = input("Введите имена героев через запятую: ")

 

2

 

lnames = names.split(",")

3

 

print(lnames)

 

4

 

names_final =

[name.strip() for name in lnames] # берем все элементы и отсекаем пробел

5

 

names_final #

готово!

 

 

 

 

Введите имена героев через запятую: bob, nika, mom ['bob', ' nika', ' mom']

Out[30]:

['bob', 'nika', 'mom']

In [ ]:

1

localhost:8888/notebooks/EXONTOOLS/2/Доп. занятия/4. Методы split и join.ipynb

7/7