Python разделить строку на списки

В этой статье мы расскажем, как можно разбивать строки на списки. Вы узнаете, как при этом использовать разделители (в частности — как отделять часть строки только по первому разделителю и как быть с последовательно идущими разделителями) и регулярные выражения. Безусловно, эта информация будет особенно полезна начинающим питонистам, но, возможно, и более опытные найдут для себя кое-что интересное.
Простое разделение строки и получение списка ее составляющих
Если вы хотите разбить любую строку на подстроки и составить из них список, вы можете просто воспользоваться методом split(sep=None, maxsplit=-1) . Этот метод принимает два параметра (опционально). Остановимся пока на первом из них — разделителе ( sep ).
Разделитель можно задать явно в качестве параметра, но можно и не задавать: в этом случае в его роли выступает пробел.
Пример использования метода split() без указания разделителя:
print("Python2 Python3 Python Numpy".split()) print("Python2, Python3, Python, Numpy".split())
['Python2', 'Python3', 'Python', 'Numpy'] ['Python2,', 'Python3,', 'Python,', 'Numpy']
Разделение строки с использованием разделителя
Python может разбивать строки по любому разделителю, указанному в качестве параметра метода split() . Таким разделителем может быть, например, запятая, точка или любой другой символ (или даже несколько символов).
Давайте рассмотрим пример, где в качестве разделителя выступает запятая и точка с запятой (это можно использовать для работы с CSV-файлами).
print("Python2, Python3, Python, Numpy".split(',')) print("Python2; Python3; Python; Numpy".split(';'))
['Python2', ' Python3', ' Python', ' Numpy'] ['Python2', ' Python3', ' Python', ' Numpy']
Как видите, в результирующих списках отсутствуют сами разделители.
Если вам нужно получить список, в который войдут и разделители (в качестве отдельных элементов), можно разбить строку по шаблону, с использованием регулярных выражений (см. документацию re.split). Когда вы берете шаблон в захватывающие круглые скобки, группа в шаблоне также возвращается как часть результирующего списка.
import re sep = re.split(',', 'Python2, Python3, Python, Numpy') print(sep) sep = re.split('(,)', 'Python2, Python3, Python, Numpy') print(sep)
['Python2', ' Python3', ' Python', ' Numpy'] ['Python2', ',', ' Python3', ',', ' Python', ',', ' Numpy']
Если вы хотите, чтобы разделитель был частью каждой подстроки в списке, можно обойтись без регулярных выражений и использовать list comprehensions:
text = 'Python2, Python3, Python, Numpy' sep = ',' result = [x+sep for x in text.split(sep)] print(result)
['Python2,', ' Python3,', ' Python,', ' Numpy,']
Разделение многострочной строки (построчно)
Создать список из отдельных строчек многострочной строки можно при помощи того же метода split() , указав в качестве разделителя символ новой строки \n . Если текст содержит лишние пробелы, их можно удалить при помощи методов strip() или lstrip() :
str = """ Python is cool Python is easy Python is mighty """ list = [] for line in str.split("\n"): if not line.strip(): continue list.append(line.lstrip()) print(list)
['Python is cool', 'Python is easy', 'Python is mighty']
Разделение строки-словаря и преобразование ее в списки или словарь
Допустим, у нас есть строка, по сути являющаяся словарем и содержащая пары ключ-значение в виде key => value . Мы хотим получить эти пары в виде списков или настоящего словаря. Вот простой пример, как получить словарь и два списка:
dictionary = """\ key1 => value1 key2 => value2 key3 => value3 """ mydict = <> listKey = [] listValue = [] for line in dictionary.split("\n"): if not line.strip(): continue k, v = [word.strip() for word in line.split("=>")] mydict[k] = v listKey.append(k) listValue.append(v) print(mydict) print(listKey) print(listValue)
['key1', 'key2', 'key3'] ['value1', 'value2', 'value3']
Отделение указанного количества элементов
Метод split() имеет еще один опциональный параметр — maxsplit . С его помощью можно указать, какое максимальное число «разрезов» нужно сделать. По умолчанию maxsplit=-1 , это означает, что число разбиений не ограничено.
Если вам нужно отделить от строки несколько первых подстрок, это можно сделать, указав нужное значение maxsplit . В этом примере мы «отрежем» от строки первые три элемента, отделенные запятыми:
str = "Python2, Python3, Python, Numpy, Python2, Python3, Python, Numpy" data = str.split(", ",3) for temp in data: print(temp)
Python2 Python3 Python Numpy, Python2, Python3, Python, Numpy
Разделение строки при помощи последовательно идущих разделителей
Если вы для разделения строки используете метод split() и не указываете разделитель, то разделителем считается пробел. При этом последовательно идущие пробелы трактуются как один разделитель.
Но если вы указываете определенный разделитель, ситуация меняется. При работе метода будет считаться, что последовательно идущие разделители разделяют пустые строки. Например, ‘1,,2’.split(‘,’) вернет [‘1’, », ‘2’] .
Если вам нужно, чтобы последовательно идущие разделители все-таки трактовались как один разделитель, нужно воспользоваться регулярными выражениями. Разницу можно видеть в примере:
import re print('Hello1111World'.split('1')) print(re.split('1+', 'Hello1111World' ))
['Hello', '', '', '', 'World'] ['Hello', 'World']
Как разделить список на две части по определенному индексу?
Есть два списка с элементами, в первом множество значений, например — [100,200,1200,1500,2000] , во втором одно значение [2] . Как разделить первый список на две части, что бы в первой части оказались все элементы списка до индекса 2 — (цифра из второго списка) а в другом списке все элементы с индексами >= 2? На входе:
y=[100,200,1200,1500,2000]; z=[2]
y1=[100,200]; y2=[1200,1500,2000]
Отслеживать
1,939 4 4 золотых знака 9 9 серебряных знаков 20 20 бронзовых знаков
python разделить список на равные группы

Это легко проверяемо. Берём рандомного питониста и просим его написать — wait, oh shi-, значит нет.
Навскидку, проверять лень:
[l for _, l in groupby(enumerate(a), lambda a: a[0] // 4)]
t184256 ★★★★★
( 01.06.20 12:19:40 MSK )
Функциональное решение через свёртку
>>> from functools import reduce >>> input = list(range(14)) >>> reduce(lambda xss, x: xss[:-1] + [xss[-1] + [x]] if len(xss[-1]) < 4 else xss + [[x]], input, [[]]) [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13]]
Crocodoom ★★★★★
( 01.06.20 13:06:54 MSK )
anonymous
( 01.06.20 13:23:02 MSK )
Ответ на: комментарий от vvn_black 01.06.20 12:15:32 MSK
простой, очевидный, быстронабираемый
WitcherGeralt ★★
( 01.06.20 13:23:56 MSK )
Ответ на: комментарий от anonymous 01.06.20 13:23:02 MSK
Тьфу, не туда посмотрел.
anonymous
( 01.06.20 13:24:07 MSK )
Ответ на: комментарий от WitcherGeralt 01.06.20 13:23:56 MSK
vvn_black ★★★★★
( 01.06.20 13:25:11 MSK )
Ответ на: комментарий от vvn_black 01.06.20 13:25:11 MSK
Ага, самое близкое к дефолтному. Меня этот пост слегка огорчил, когда я понял, что стандартного способа нет.
WitcherGeralt ★★
( 01.06.20 13:26:45 MSK )
Ответ на: комментарий от WitcherGeralt 01.06.20 13:26:45 MSK
надо бросать всё и срочно делать python 4
buratino ★★★★★
( 01.06.20 13:32:16 MSK ) автор топика
Ответ на: комментарий от WitcherGeralt 01.06.20 13:26:45 MSK
Меня этот пост слегка огорчил, когда я понял, что стандартного способа нет.
Так это же везде делается через слайсы. Или нет?
vvn_black ★★★★★
( 01.06.20 13:35:51 MSK )

ОТнаследовать list и перегрузить в нем операцию div, сразу появится
AntonI ★★★★
( 01.06.20 13:39:50 MSK )
Ответ на: комментарий от vvn_black 01.06.20 13:35:51 MSK
Слайсы слайсами, а какой-нибудь хелпер в itertools мог бы и найтись.
WitcherGeralt ★★
( 01.06.20 14:32:03 MSK )
Ответ на: комментарий от AntonI 01.06.20 13:39:50 MSK
перегрузить в нем операцию div, сразу появится
Хорошая идея, только лучше mod , так как от list / 2 ожидаешь всё-таки деления списка пополам
Crocodoom ★★★★★
( 01.06.20 14:32:40 MSK )
Ответ на: комментарий от Crocodoom 01.06.20 14:32:40 MSK

Ну от mod можно ожидать получение среза с хвоста…
Давно пора сделать ЯП куда можно вводить свои операции;-)
AntonI ★★★★
( 01.06.20 14:54:36 MSK )
Ответ на: комментарий от Crocodoom 01.06.20 14:32:40 MSK

перегрузить в нем операцию div, сразу появится
Хорошая идея, только лучше mod, так как от list / 2 ожидаешь всё-таки деления списка пополам
Готового способа нет именно поэтому.
Хочешь кастомное действие, которое должно однозначно пониматься при чтении кода - опиши его как можно более простыми из имеющихся средств языка, не плодя лишних сущностей.
blexey ★★★★★
( 01.06.20 14:56:52 MSK )
Ответ на: комментарий от AntonI 01.06.20 14:54:36 MSK

Давно пора сделать ЯП куда можно вводить свои операции;-)
Но зачем еще один Forth?
blexey ★★★★★
( 01.06.20 15:01:41 MSK )
anonymous
( 01.06.20 15:51:48 MSK )
qulinxao3 ★
( 06.06.20 12:22:11 MSK )
def parting(inp,d): o,c=[],[] for z in inp: c.append(z); if len(c)==d: o.append(c) c=[] else: if c: o.append(c) return o def jojo(ll): return [''.join(l) for l in ll] print(jojo(parting('abcdef1234',4)),file=__import__('sys').stdout)
parting - он конечно в лоб и линейно без всяких лист компиренсив - но вот прям простой, очевидный, быстронабираемый и быстрозапоминаемый
qulinxao3 ★
( 06.06.20 12:47:16 MSK )
qulinxao3 ★
( 07.06.20 19:26:23 MSK )
Ответ на: комментарий от qulinxao3 06.06.20 12:22:11 MSK
порфирьевич
а вот что будет, если посты qulinxao скормить порфирьевичу #порфирьевич ?
развлекался пару дней, скармливая коллекцию мицголизмов порфирьевичу – невозбранно достигнув желаемого.
хотя там простые марковские цепи. и вроде память не очень длинная.
anonymous
( 11.06.20 02:48:45 MSK )
Ответ на: порфирьевич от anonymous 11.06.20 02:48:45 MSK
сообщай итоги (и промежуточные тож)
qulinxao3 ★
( 11.06.20 10:50:52 MSK )
Ответ на: комментарий от qulinxao3 11.06.20 10:50:52 MSK
anonymous
( 11.06.20 15:31:40 MSK )
Ответ на: комментарий от qulinxao3 11.06.20 10:50:52 MSK
философическое
anonymous
( 11.06.20 15:45:41 MSK )
Ответ на: комментарий от qulinxao3 11.06.20 10:50:52 MSK
anonymous
( 11.06.20 16:01:39 MSK )
Ответ на: комментарий от qulinxao3 11.06.20 10:50:52 MSK
anonymous
( 11.06.20 16:26:16 MSK )
Ответ на: комментарий от anonymous 11.06.20 16:26:16 MSK
ещё 20 лет назад такое делали 🙂
buratino ★★★★★
( 11.06.20 16:34:22 MSK ) автор топика
Ответ на: комментарий от qulinxao3 11.06.20 10:50:52 MSK
anonymous
( 11.06.20 16:42:13 MSK )
Ответ на: комментарий от buratino 11.06.20 16:34:22 MSK
вот это да! многобукав. и не уломает же писать 🙂 а есть начальники которые примерно так и могут задвинуть.
мощно. внушаить. и ниачом 🙂
anonymous
( 11.06.20 16:46:15 MSK )

rupert ★★★★★
( 11.06.20 16:52:58 MSK )
Ответ на: комментарий от anonymous 11.06.20 16:46:15 MSK
вот ещё генератор фэнтэзи
buratino ★★★★★
( 11.06.20 16:55:53 MSK ) автор топика
Ответ на: комментарий от buratino 11.06.20 16:55:53 MSK
В процессе финальной схватки герой получает 5000 золотых и по морде. Но он встает и говорит: — Уйди, противный! Злодей от ужаса меняет фамилию.
Всем наступает хэппи-энд, все живут долго и счастливо, а главный герой продолжает в том же духе.
anonymous
( 11.06.20 16:57:25 MSK )
Ответ на: комментарий от anonymous 11.06.20 16:57:25 MSK
он знал
Как оказывается, враг героя — светлая голова. В процессе тяжелого, тупого и нудного разговора выясняется, что герой — хрен моржовый. Вскоре наступает финальная битва между всеми возможными странами, народами и божествами. Напарники героя обижаются и покидают героя.
Сила злодеев такова, что их можно победить только сбросив все, что осталось, в жерло вулкана
anonymous
( 11.06.20 16:58:47 MSK )
Ответ на: комментарий от anonymous 11.06.20 16:57:25 MSK
хоть сейчас в печать:
В одном старом доме с привидениями жил один среднестатистический-ничем-не-примечательный паренек. Из родных и близких у него был воспитавший его друг умершего отца (никому не известный, даже отцу).
И вот однажды к нему подходит странно выглядящий человек и говорит: Ты — избранный! Герой ничуть не удивляется.
Тогда пришелец говорит: — Беги, прячься скорее, ОНИ идут за тобой. Герой со свистом покидает родные места. Он бежит к знакомым странного визитера.
Странный визитер тем временем лежит мертвый.
В пути герой встречает нового друга. Вскоре они вместе становятся атакованы друг другом. Избавившись от неприятелей, герой с компанией добирается до места, где их посылают на.
Как оказывается, враг героя — абстрактное зло в серую полосочку. В процессе тяжелого, тупого и нудного разговора выясняется, что герой — хрен моржовый. Вскоре наступает финальная борьба за мир между героем и главным злодеем. Напарники героя погибают от собственной глупости, произнеся перед этим торжественную речь.
Сила злодеев такова, что их можно победить только найдя древний артефакт (или потеряв, если уже нашли)
В процессе финальной схватки герой получает Оскара за лучшую мужскую роль. Но он встает и говорит: — Со мной Сила! Злодей от ужаса меняет фамилию.
Всем наступает хэппи-энд, все живут долго и счастливо, а главный герой на цыпочках под шумок перебирается в следующую часть произведения.
Как разделить список на список список списков?
1. Что значит "короче"?
2. Где в вашем примере "список список списков"?
3. По какому принципу вы поделили свой исходный список? И почему вы выбрали именно такой вариант, а не [[1,2,3],[4,5,6]] например?
Woshibai @Woshibai Автор вопроса
dmshar, 1) Как можно более кратко.
2) Может, не так слова подобрал. Но я привел пример, который, надеюсь, понятен.
3) Потому что так надо.
Решения вопроса 1

Руслан Гильфанов @ri_gilfanov
Web- and desktop-developer
l = [1, 2, 3, 4, 5, 6] l = [[l[i], l[j]] for i, j in zip(range(0, len(l) - 1, 2), range(1, len(l), 2))] print(l)
Update. По наводке aRegius о срезах, вариант с zip() можно сократить так:
l = [1, 2, 3, 4, 5, 6] l = [[i, j] for i, j in zip(l[0::2], l[1::2])] print(l)
Ответ написан более трёх лет назад
Комментировать
Нравится 2 Комментировать
Ответы на вопрос 2

Andrey Dugin @adugin Куратор тега Python
Чуть ли не каждый день этот вопрос задают. Это классический "трюк" на Python, между прочим:
list(zip(*[iter(lst)]*2))
Ответ написан более трёх лет назад
Нравится 3 8 комментариев

Алан Гибизов @phaggi Куратор тега Python
Тааак, это надо осмыслить хорошенько 🙂
У меня вот такое получилось:
[[lst[i], lst[i+1]] for i in range(0,len(lst),2)]
В лоб, так сказать.

Алан Гибизов @phaggi Куратор тега Python
Andrey Dugin, а там унутре вместо списка получается ведь кортеж.
может, так?
list(map(list, list(zip(*[iter(lst)]*2))))