Перейти к содержимому

Как разделить элементы списка python

  • автор:

Как разделить строку по пробелам python

Такую задачу всегда можно решить с помощью цикла. Но в Python есть метод .split() . Именно его обычно используют для разделения строки на части. В качестве разделителя можно использовать любой символ: пробел, запятую, перенос строки ( \n ) и т.д.

На выходе мы получим список строк:

str = 'how are you' str.split(' ') # ['how', 'are', 'you'] 

Пробел как разделитель можно не указывать. Метод .split() будет использовать параметр по умолчанию:

str = 'how are you?' str.split() # ['how', 'are', 'you'] 

Иногда перед тем, как разделить строку, необходимо избавиться от лишних знаков препинания:

str = 'Hi, how are you?' str[:-1].replace(',', '').split() # ['Hi', 'how', 'are', 'you'] 

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']

Разбить список на равные части в Python 3

Разбить список на равные части в Python

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

Введение

Разбиение строк и списков — это типичная задача программиста. Иногда нам приходится разбивать наши данные особым образом, но чаще — на равные части.

Язык не имеет встроенной функции для этого, и в этом уроке я покажу, как разбить список в Python.

В большинстве случаев это можно сделать с помощью генераторов:

def func(lst, n): for i in range(0, len(lst), n): yield lst[i:i + n]

Хотя есть и другие интересные способы сделать это, каждый со своими плюсами и минусами!

На равные части из n элементов

Список может быть разделен на основе размера определенного фрагмента. Это означает, что мы можем определить размер данной части. Если подмножество списка не вписывается в размер определенного фрагмента, заполнители должны быть вставлены вместо пустых держателей элементов. В этих случаях я буду использовать функцию None.

Давайте создадим новый файл и начнем программирование:

def func_chunk(lst, n): for x in range(0, len(lst), n): e_c = lst[x : n + x] if len(e_c) < n: e_c = e_c + [None for y in range(n - len(e_c))] yield e_c print(list(func_chunk([9, 8, 7, 6, 5, 4, 3, 2, 1], 3)))

Приведенная выше функция func_chunk принимает аргументы: lst для списка и chunk_size для числа, на которое его нужно разделить. Функция выполняет итерацию по списку с приращением размера фрагмента n.

Ожидается, что каждый фрагмент будет иметь размер, заданный в качестве аргумента. Если элементов недостаточно для разделения на один и тот же размер, оставшиеся неиспользуемые элементы заполняются None.

[[9, 8, 7], [6, 5, 4], [3, 2, 1]]

Список был разделен на равные части по 3 элемента в каждой.

Python имеет утилиты для упрощения этого процесса. Мы можем использовать функцию zip_longest из itertools для упрощения предыдущей функции.

Давайте создадим новый файл и напишем следующий код:

from itertools import zip_longest def func_chunk_itertools(lst): i_ = iter(lst) return list(zip_longest(i_, i_, i_, i_)) print(func_chunk_itertools([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]))

Этот код повторяет элементы и возвращает фрагмент желаемой длины на основе предоставленных вами аргументов.

Мы поместили в коде 4 аргументf i_. Функция zip_longest агрегирует и возвращает элементы из каждой итерации. В этом случае она будет агрегировать элементы из списка, который повторяется 4. Затем создается множество итераторов, содержащих 4 последовательных элементов, которые после преобразуются в список и возвращаются.

Вывод программы будет таков:

[(0, 1, 2, 3), (4, 5, 6, 7), (8, 9, 10, 11), (12, 13, 14, None)]

Эта более короткая функция приводит к тому же выводу программы. Однако этот метод более ограничен, так как нам приходится вручную писать, сколько элементов мы хотим в коде, и немного неудобно просто помещать кучу i_ в вызов zip_longest.

Лучшим решением было бы использование генераторов. Давайте создадим новый файл:

def func_chunks_generators(lst, n): for i in range(0, len(lst), n): yield lst[i : i + n] print( list( func_chunks_generators( [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 8, 7, 6, 54, 3, 2, 2, 1], 4 ) ) )

Этот генератор дает подсписок, содержащий n элементов. В конце концов, это дало бы подсписок для каждой части.

[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 8, 7], [6, 54, 3, 2], [2, 1]]

Этот метод работает лучше всего, если вам не нужно заполнение кода с помощью None или иным образом.

На n равных частей

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

Что мы делаем, когда хотим разбить список не по количеству элементов в каждом фрагменте, а по количеству фрагментов, которые мы хотим создать?

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

Логика аналогична предыдущим методам, однако размер части — это предельное значение длины списка, деленное на количество требуемых частей. Как и в предыдущих примерах кода, если в части есть свободные места, они будут заполнены значением None:

import math def func_chunks_num(lst, c_num): n = math.ceil(len(lst) / c_num) for x in range(0, len(lst), n): e_c = lst[x : n + x] if len(e_c) < n: e_c = e_c + [None for y in range(n - len(e_c))] yield e_c print(list(func_chunks_num([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], c_num=3)))

Мы определяем, сколько списков нам нужно создать и сохранить это значение в n. Затем мы создаем подсписок для двух элементов одновременно, заполняя выходные данные в случае, если размер нашего фрагмента меньше желаемой длины.

[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, None]]

Как видно из приведенных выше выходных данных, список был разделен на 3 отдельных подспискf равных размеров на основе предоставленного аргумента c_num.

Заключение

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

Методы, упомянутые в этой статье, не ограничиваются теми, которые были прописаны здесь, но есть множество других творческих способов, с помощью которых вы также можете разделить свой список на равные части!

Как разделить элементы списка Python, символов в которых больше, чем 4?

Есть список df['price'], с элементами [1605, 9550, 12556430. ]. Необходимо разделить элементы в которых больше символов, чем 4: [1605, 9550, 1255 6430. ]
Как это сделать?

  • Вопрос задан более года назад
  • 104 просмотра

Комментировать

Решения вопроса 0

Ответы на вопрос 3

Dunaevlad

x = [1605, 9550, 12556430] for n in x: s = str(n) print(n/2) if len(s) > 4 else ""

Ответ написан более года назад

Комментировать

Нравится Комментировать

lxstvayne

Люблю Python

Написал такое решение, может разделить минус как показано в одном из асссертов.

from itertools import groupby def join_segments(string: str, group_len: int, sep: str = ' '): groups = groupby( enumerate(reversed(string)), lambda el: el[0] // group_len ) string = sep.join( ''.join(char for i, char in group) for _, group in groups ) return string[::-1] if __name__ == '__main__': assert join_segments('1605', 4) == '1605' assert join_segments('9550', 4) == '9550' assert join_segments('12556430', 4) == '1255 6430' assert join_segments('1', 4) == '1' assert join_segments('-1234', 4) == '- 1234' assert join_segments('1234', 1) == '1 2 3 4' assert join_segments('1234', 10) == '1234' assert join_segments('', 10) == ''

Ответ написан более года назад

Комментировать

Нравится Комментировать

aquapendente @aquapendente

def split_list(values): return list(filter(lambda x: len(str(x)) > 4, values)) y = split_list(df['price'])

Ответ написан более года назад

Комментировать

Нравится Комментировать

Ваш ответ на вопрос

Войдите, чтобы написать ответ

python

  • Python
  • +1 ещё

Как отфильтровать текст Python?

  • 1 подписчик
  • 49 минут назад
  • 36 просмотров

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *