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']
Как разбить список на переменные?

Чтобы распаковать список в несколько переменных не нужно писать split(), тем более что у объекта типаlist нет метода split().
Достаточно сделать так:
top1, top2, top3 = names
Соответственно в top1 пойдет первый элемент списка names и т.д.
Ответ написан более двух лет назад
apiwi @apiwi Автор вопроса
Извини, у меня там словарь ошибся.
ValueError: too many values to unpack (expected 3)
apiwi, «слишком много значения для распаковки (ожидалось 3)»
Это означает что слева от равно у вас 3 объекта, а справа их больше. Например
a, b, c = [1,2,3,4]
Ваш ответ на вопрос
Войдите, чтобы написать ответ

- Python
- +1 ещё
Error Connecting: HTTPSConnectionPool(host=’url’, port=443) как решить?
- 1 подписчик
- 4 часа назад
- 11 просмотров
Разделить элемент списка на разные элементы

Проясните пожалуйста, как в 4ой строке происходит требуемое разделение элемента. Вообще не понял конструкцию «если у найденного элемента тип list, то добавить этот элемент в новый список, а если не list» . то что сделать?
1 2 3 4 5
list1 = ['apple', 'grape', ['apple1', 'grape1'] ] list2 = [] for x in list1: list2 += x if type(x) == list else [x] print(list2)
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Разделить на Х все элементы списка, которые находятся четных позициях списка
Всем привет. Возникла у меня следущая задача. Есть вот такая программа на С. Необходимо.

Найти минимальный элемент матрицы и разделить все элементы на этот элемент
Задана матрица А(n,m). Cоставить программу для выполнения действий над матрицей. Количество строк.
Разделить каждый элемент списка на 2
дан список элементы которого натуральные числа. разделить каждый элемент на 2
1183 / 759 / 277
Регистрация: 05.09.2021
Сообщений: 1,772
atracom, так вам будет нагляднее
1 2 3 4 5 6
a = ['список 1'] b = ['список 2'] c = ['список 3'] d = a + b + c print(d)
Добавлено через 1 минуту
Потому что складывать строку и структуру данных таким методом нельзя, вот что будет:
1 2 3 4 5 6
a = ['список 1'] b = 'строка 1' c = 'строка 2' d = a + b + c print(d)
TypeError: can only concatenate list (not "str") to list
Добавлено через 1 минуту
Теперь по простому, что именно делает код:
1. Бери элемент коллекции.
2. Если элемент это список, складывай его со списком 2.
3. Если элемент не список, сделай его списком и складывай.
Регистрация: 27.04.2018
Сообщений: 9
enx
Не понимаю(
Когда мы делаем for x в list1 [«строка1», «строка2», [«строка3», «строка4»]], то будут найдены 3 элемента: строка, строка и вложенный список.
list2 += найденный вложенный список
добавит list2 уже не 1 элемент типа list, а 2 элемента-строки. А за счет чего оно вложенный список разбило на 2 строки?
Ведь если мы потом снова делаем list2 += [[«5», «6»]], то получаем [‘1’, 2, ‘3’, ‘4’, [‘5’, ‘6’]]
1183 / 759 / 277
Регистрация: 05.09.2021
Сообщений: 1,772
Вы простите, на этом я все, почитайте подробнее про структуры данных, я не знаю как вам по другому это объяснить.
1 2 3
a = ['а', 'б', 'в', 'г', 'д', ['а', 'б', 'в', 'г', 'д']] for i, j in enumerate(a): print(f'Индекс: | Содержание: | Тип: ', sep='\n')
1096 / 683 / 305
Регистрация: 05.09.2021
Сообщений: 1,165
Сообщение от atracom 
А за счет чего оно вложенный список разбило на 2 строки?
Оно не разбивал вложенный список. Он каким был таким и остался.
Выше вы верно подметили
Сообщение от atracom 
Когда мы делаем for x в list1 [«строка1», «строка2», [«строка3», «строка4»]], то будут найдены 3 элемента: строка, строка и вложенный список.
А в строке
list2 += x if type(x) == list else [x]
используется оператор конкатенации списков. Т.е. склеивания их. Не добавление элементов в список, а добавление в конец одного списка, другого списка.
Но т.к. склеить список со строкой мы не можем. То там есть условие, что если это не список, мы делаем из него список (из одного элемента) и конкатенируем их.
Регистрация: 27.04.2018
Сообщений: 9
enx, ок, ладно, спасибо, очень неловко за ваше потраченное, надеюсь ничего плохого из-за этого не случится.
Когда не знаешь, как объяснить, то действительно лучше этого не делать.
![]()
5417 / 3841 / 1214
Регистрация: 28.10.2013
Сообщений: 9,554
Записей в блоге: 1
Сообщение от atracom 
А за счет чего оно вложенный список разбило на 2 строки
За счет метода extend для списка.
Плюсик это просто синт. сахар для операции расширения списка элементами другого списка.
1 2 3 4 5
>>> a= [] >>> a.extend([1,2,3]) >>> a [1, 2, 3] >>>
Регистрация: 27.04.2018
Сообщений: 9
anton78spb, Garry Galler
чуть полегчало. Благодарю
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Выбрать max элемент матрицы, элементы четных строк разделить на этот элемент, к элементам нечетных — прибавить
В данной задаче матрица – двумерный динамический массив, который считывается из некоторого.

дан одномерный массив А. Поменять местами последний положите и второй элемент массива. Разделить все элементы с четными номерами на первый элемент.
дан одномерный массив А. Поменять местами последний положите и второй элемент массива. Разделить.
Разделить элементы массива на первый элемент
дан массив.все его элементы разделить на первый элемент

Разделить элементы матрицы на минимальный элемент
Даны матрицы А(7, 9), В(5, 3), С(15, 9). С помощью процедуры-функции сформировать новые матрицы.

Разделить элементы массива на первый элемент
дан массив.все его элементы разделить на первый элемент
Или воспользуйтесь поиском по форуму:
Разбить элементы списка посимвольно
Здравствуйте! Подскажите, пожалуйста, как можно разбить уловный список [‘1′, ’22’, ‘333’] по символам, т.е. чтобы получился список [‘1’, ‘2’, ‘2’, ‘3’, ‘3’, ‘3’] Заранее спасибо!
Отслеживать
3,998 5 5 золотых знаков 21 21 серебряный знак 35 35 бронзовых знаков
задан 16 авг 2016 в 12:52
161 1 1 золотой знак 2 2 серебряных знака 6 6 бронзовых знаков
8 ответов 8
Сортировка: Сброс на вариант по умолчанию
На функциональщине в одну строчку:
reduce(lambda a, x: a + x, map(lambda x: list(x), ['1', '22', '333']))
Поясняю — reduce принимает на вход функцию, которая объединяет результаты разбиения списка функцией map . Map принимает на вход функцию и начальный массив, над каждым элементом массива выполняется данная функция. То же самое можно выразить следующим кодом:
>>> result_list = [] >>> for x in ['1', '22', '333']: . for y in list(x): . result_list.append(y) . >>> print(result_list) ['1', '2', '2', '3', '3', '3']
Сравнение по скорости предложенных вариантов:
Вариант с использованием join и объединением в строку результата уделал всех. Оно и неудивительно — все операции здесь быстрые. Будет работать с любыми iterable объектами:
$python3 -m timeit "list(''.join(['1', '22', '333']))" 1000000 loops, best of 3: 0.318 usec per loop
Вариант с использованием генератора списка из ответа @jfs действительно работает быстро:
$python3 -m timeit "[char for s in ['1', '22', '333'] for char in s]" 1000000 loops, best of 3: 0.452 usec per loop
Вариант с использованием sum занимает третье место по скорости, однако по моему мнению, проигрывает в интуитивности:
$python3 -m timeit "sum([list(i) for i in ['1', '22', '333']], [])" 1000000 loops, best of 3: 0.984 usec per loop
Вариант на map-reduce является самым медленным. Почему я его использую? Потому что мне нравятся цепочки вызовов. Остальное — вкусовщина. Однако даже Гвидо ненавидит reduce (и вынес его в functools в python3)
$python3 -m timeit "from functools import reduce; reduce(lambda a, x: a + x, map(lambda x: list(x), ['1', '22', '333']))" 100000 loops, best of 3: 2.16 usec per loop
Вариант с collections покрывает все случаи, когда передаваемый объект может быть неитерируемым (число, например), однако цена за такое — большое время выполнения:
$python3 -m timeit "import collections def it(obj): if isinstance(obj, collections.Iterable): for ob in obj: if isinstance(ob, collections.Iterable) and len(ob) > 1: yield from it(ob) else: yield ob else: yield obj list(it(['1', 2, [2, 44, '123', ('qwe')], 2]))" 100000 loops, best of 3: 14.6 usec per loop
Отслеживать
28.8k 12 12 золотых знаков 59 59 серебряных знаков 118 118 бронзовых знаков
ответ дан 16 авг 2016 в 13:01
3,071 12 12 серебряных знаков 20 20 бронзовых знаков
16 авг 2016 в 14:15
@jfs дополнил ответ
16 авг 2016 в 14:48
Сравнение скоростей на таких данных выглядит странно. В таком случае самым быстрым способом будет создать список [‘1’, ‘2’, ‘2’, ‘3’, ‘3’, ‘3’] .
16 авг 2016 в 16:10
а у меня summ последний 🙂
16 авг 2016 в 19:25
Раз уж тут начали коллекционировать разные способы, предложу такое:
list(''.join(['1', '22', '333']))
(Теперь кто-то должен сравнить производительность всех вариантов 🙂
Отслеживать
ответ дан 16 авг 2016 в 13:23
13k 10 10 золотых знаков 41 41 серебряный знак 78 78 бронзовых знаков
Теперь есть сравнение 🙂
16 авг 2016 в 14:59
chars = ».join(strings) отличный вариант, если автору нужна просто (неизменяемая) последовательность символов: можно не вызывать list() .
21 авг 2016 в 7:59
А можно сделать так:
l = ['1', '22', '333'] s = sum([list(i) for i in l], []) print(s) ['1', '2', '2', '3', '3', '3']
Отслеживать
ответ дан 16 авг 2016 в 13:05
773 4 4 серебряных знака 17 17 бронзовых знаков
Это квадратичный алгоритм : при добавлении каждого списка, суммарный список заново создаётся (как маляр из анекдота: «Ничего не могу поделать—Каждый день я ухожу все дальше и дальше от банки!» (для сравнения ».join(strings) и генератор списков из моего ответа линейны по кол-ву символов).
24 сен 2016 в 11:32
Чтобы получить список символов из списка строк, можно использовать вложенный цикл в генераторе списков:
strings = ['1', '22', '333'] chars = [char for s in strings for char in s] # chars -> ['1', '2', '2', '3', '3', '3']
Согласно @Alex Martelli этот вариант может быть быстрее решений, использующих sum() , reduce() . Решение с генератором списков также более читаемо по сравнению с reduce() .
Отслеживать
ответ дан 16 авг 2016 в 14:09
52.3k 11 11 золотых знаков 108 108 серебряных знаков 312 312 бронзовых знаков
import collections def it(obj): if isinstance(obj, collections.Iterable): for ob in obj: if isinstance(ob, collections.Iterable) and len(ob) > 1: yield from it(ob) else: yield ob else: yield obj a = list(it(['1', 2, [2, 44, '123', ('qwe')], 2])) print(a) ['1', 2, 2, 44, '1', '2', '3', 'q', 'w', 'e', 2]
Отслеживать
ответ дан 16 авг 2016 в 13:04
vadim vaduxa vadim vaduxa
8,937 14 14 серебряных знаков 24 24 бронзовых знака
a = ['1', '22', '333'] a = [x for x in ''.join(a)]
Отслеживать
ответ дан 16 авг 2016 в 14:01
2,332 6 6 золотых знаков 21 21 серебряный знак 34 34 бронзовых знака
import time from functools import wraps, reduce def tefn(fn, args, kwargs): t = time.time() tuple(fn(*args, **kwargs)) return t - time.time() def efn(fn, args, kwargs): t = time.time() fn(*args, **kwargs) return t - time.time() def runTime(tp=0, count=25): def dec(fn): @wraps(fn) def wrap(*args, **kwargs): print(fn) res = tefn if tp else efn return sum(res(fn, args, kwargs) for _ in range(count)) / count return wrap return dec @runTime() def fnTuple(): return tuple(char for s in list_ for char in s) @runTime(tp=1) def fnIter(): return iter(char for s in list_ for char in s) @runTime() def fnList(): return list(char for s in list_ for char in s) @runTime(tp=1) def fnYield(): for a in list_: yield from a @runTime(tp=1) def fnJoin(): return ''.join(list_) @runTime() def fnSumm(): return sum([list(i) for i in list_], []) @runTime() def fnReduce(): return reduce(lambda a, x: a + x, map(lambda x: list(x), list_)) @runTime() def fnNew(): return ['1' * 999, '22' * 999, '333' * 999] * 99 if __name__ == '__main__': list_ = ['1' * 999, '22' * 999, '333' * 999] * 99 g = globals() result = list((fn.__name__, fn()) for fn in (g[f] for f in g if f.startswith('fn'))) result.sort(key=lambda r: r[1], reverse=True) for e, r in enumerate(result): print(e, r)
0 ('fnNew', 0.0) 1 ('fnJoin', -0.018803834915161133) 2 ('fnYield', -0.04936907768249512) 3 ('fnTuple', -0.061401805877685546) 4 ('fnList', -0.06224835395812988) 5 ('fnIter', -0.07298644065856934) 6 ('fnSumm', -0.8121062469482422) 7 ('fnReduce', -0.8314747619628906)
Отслеживать
ответ дан 16 авг 2016 в 18:14
vadim vaduxa vadim vaduxa
8,937 14 14 серебряных знаков 24 24 бронзовых знака
import pandas as pd a = ['1', 2, [2, 44, '123', ('qwe')], 2] df = pd.DataFrame(a, columns=['a']) a = list(''.join(map(str, df.explode('a')['a'])))
Отслеживать
ответ дан 19 дек 2020 в 19:35
mr.polden2010 mr.polden2010
91 4 4 бронзовых знака
- python
- python-3.x
- list
- список
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.26.3951