
4. Методы split и join - Jupyter Notebook
.pdf
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 |