Как сделать список чисел из строки python

Добавил пользователь Cypher
Обновлено: 05.10.2024

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

Метод № 1: Наивный метод

Это наиболее общий метод, который поражает любого программиста при выполнении такого рода операций. Просто зацикливание по всему списку и преобразование каждой строки списка в int путем приведения типа.

test_list = [ '1' , '4' , '3' , '6' , '7' ]

print ( "Original list is : " + str (test_list))

for i in range ( 0 , len (test_list)):

test_list[i] = int (test_list[i])

print ( "Modified list is : " + str (test_list))

Метод № 2: Использование понимания списка

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

test_list = [ '1' , '4' , '3' , '6' , '7' ]

print ( "Original list is : " + str (test_list))

test_list = [ int (i) for i in test_list]

print ( "Modified list is : " + str (test_list))

Способ № 3: Использование map()

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

Я извлечу все числа, содержащиеся в строке. Что лучше подходит для этой цели, регулярные выражения или метод isdigit() ?

ОТВЕТЫ

Ответ 1

Если вы хотите извлечь только целые положительные числа, попробуйте следующее:

Я бы сказал, что это лучше, чем пример регулярного выражения по трем причинам. Во-первых, вам не нужен другой модуль; во-вторых, это более читаемо, потому что вам не нужно разбирать мини-язык регулярных выражений; и, в-третьих, он быстрее (и, следовательно, скорее, более питонический):

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

Ответ 2

Я бы использовал regexp:

Это также соответствует 42 из bla42bla . Если вам нужны только числа, ограниченные границами слов (пробел, период, запятая), вы можете использовать \b:

В итоге получится список чисел вместо списка строк:

Ответ 3

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

Дает все хорошо!

Ответ 4

Я предполагаю, что вы хотите плавать не только целыми числами, поэтому я бы сделал что-то вроде этого:

Обратите внимание, что некоторые другие решения, размещенные здесь, не работают с отрицательными номерами:

Ответ 5

Если вы знаете, что в строке будет только одно число, то есть "привет 12 привет", вы можете попробовать фильтр.

Но будь осторожен . :

Ответ 6

Ответ 7

Я искал решение для удаления строковых масок, особенно с бразильских телефонных номеров, этот пост не ответил, но вдохновил меня. Это мое решение:

Ответ 8

В этом ответе также содержится случай, когда число с плавающей точкой в ​​строке

Ответ 9

Использование Regex ниже - это способ

Ответ 10

Я поражен, увидев, что никто еще не упомянул использование itertools.groupby в качестве альтернативы для достижения этой цели.

Вы можете использовать itertools.groupby() вместе с str.isdigit() для извлечения чисел из строки как:

Значение, удерживаемое l будет:

PS: Это просто для иллюстрации, чтобы показать, что в качестве альтернативы мы могли бы также использовать groupby для достижения этой цели. Но это не рекомендуемое решение. Если вы хотите добиться этого, вы должны использовать принятый ответ fmark, основанный на использовании понимания списка с str.isdigit качестве фильтра.

Ответ 11

Поскольку ни один из них не занимался финансовыми цифрами реального мира в документах Excel и Word, которые мне нужно было найти, вот моя вариация. Он обрабатывает ints, float, отрицательные числа, номера валют (потому что он не отвечает на split), и имеет возможность отбрасывать десятичную часть и просто возвращать ints или возвращать все.

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

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

Он также не выделяет даты. Есть лучшие способы поиска дат в строках.

Ответ 12

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

Ответ 13

@jmnas, мне понравился ваш ответ, но он не нашел поплавков. Я работаю над script для анализа кода, идущего на станцию ​​с ЧПУ, и ему нужно найти как размеры X, так и Y, которые могут быть целыми числами или плавать, поэтому я адаптировал ваш код к следующему. Это находит int, float с положительными и отрицательными vals. Все еще не находит шестнадцатеричные форматированные значения, но вы можете добавить "x" и "A" через "F" в кортеж num_char , и я думаю, что он будет анализировать такие вещи, как "0x23AC".

Ответ 14

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

Ответ 15

Вы можете искать все целые числа в строке через цифру, используя выражение findall.

На втором шаге создайте список res2 и добавьте найденные в строке цифры в этот список

Я бы извлек все числа, содержащиеся в строке. Что лучше подходит для цели, регулярных выражений или isdigit() метода?

Если вы хотите извлечь только положительные целые числа, попробуйте следующее:

Я бы сказал, что это лучше, чем пример регулярных выражений по трем причинам. Во-первых, вам не нужен другой модуль; во-вторых, он более читабелен, потому что вам не нужно разбирать мини-язык регулярных выражений; и в-третьих, это быстрее (и, следовательно, скорее более питон):

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

Нормативный случай использования re . Это общий и мощный инструмент (поэтому вы узнаете что-то очень полезное). Скорость несколько не имеет значения при разборе журнала (это не какой-то интенсивный числовой решатель в конце концов), re модуль находится в стандартной библиотеке Python, и его загрузка не помешает.

У меня были строки, mumblejumble45mumblejumble в которых я знал, что был только один номер. Решение простое int(filter(str.isdigit, your_string)) .

Небольшой комментарий: вы определяете переменную, str которая затем переопределяет str объект и метод в базовом питоне. Это не очень хорошая практика, так как она может понадобиться вам позже в сценарии.

int(filter(. )) повысит TypeError: int() argument must be a string. для Python 3.5, так что вы можете использовать обновленную версию: int(''.join(filter(str.isdigit, your_string))) для извлечения всех цифр в одно целое число.

Я бы использовал регулярное выражение:

Это также будет соответствовать 42 от bla42bla . Если вам нужны только числа, разделенные границами слов (пробел, точка, запятая), вы можете использовать \ b:

Чтобы получить список чисел вместо списка строк:

. а затем нанесите int на карту и все готово. +1 особенно для последней части. Я бы предложил сырые строки ( r'\b\d+\b' == '\\b\\d+\\b' ), хотя.

Его можно поместить в список с генератором, например: int_list = [int(s) for s in re.findall('\\d+', 'hello 12 hi 89')]

@GreenMatt: технически это понимание списка (а не генератор), но я бы согласился, что понимание / генераторы более Pythonic, чем map .

@Seth Джонсон: Ой! Вы правы, я опечатка в том, что было, по-видимому, в туманном состоянии. :-( Спасибо за исправление!

У меня проблема, хотя. Что делать, если я хочу извлечь числа с плавающей точкой, такие как 1.45 в "hello1.45 hi". Это даст мне 1 и 45 как два разных числа

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

Дает все хорошо!

Кроме того, вы можете посмотреть на регулярное выражение AWS Glue

Поскольку это единственный ответ, который кому-либо нравится, вот как это сделать с помощью научной записи "[- +]? \ D + [\.]? \ D * [Ee]? \ D *". Или какой-то вариант. Радоваться, веселиться!

Найти есть проблема в простейшем случае, например, не s = "4" возвращает совпадений. Можно ли отредактировать, чтобы позаботиться об этом?

Более многословная группа: [+-]?\d*[\.]?\d*(?:(?:[eE])[+-]?\d+)? Эта группа дает некоторые ложные срабатывания (то + есть иногда захватывается сама собой), но может обрабатывать больше форм, например .001 , плюс она не объединяет числа автоматически (как в s=2+1 )

Ах да, очевидное [-+]?[.]?[\d]+(. \d\d\d)*[\.]?\d*(?:[eE][-+]?\d+)? - так глупо с моей стороны . как я мог не думать об этом?

Я предполагаю, что вы хотите, чтобы числа с плавающей точкой не просто целые числа, поэтому я бы сделал что-то вроде этого:

Обратите внимание, что некоторые другие решения, опубликованные здесь, не работают с отрицательными числами:

Это находит положительные и отрицательные числа с плавающей запятой и целые числа. Для положительных и отрицательных целых чисел измените float на int .

Это ловит больше, чем просто положительные целые числа, но использование split () пропустит числа с символами валюты, предшествующими первой цифре без пробела, что часто встречается в финансовых документах

Но будь осторожен . :

В Python 3.6.3 я получил TypeError: int() argument must be a string, a bytes-like object or a number, not 'filter' - исправил это с помощью int("".join(filter(str.isdigit, '200 grams')))

ValueError: не удалось преобразовать строку в число с плавающей точкой: 'e', ​​и в некоторых случаях это не работает :(

Я искал решение для удаления масок строк, особенно с бразильских номеров телефонов, этот пост не ответил, но вдохновил меня. Это мое решение:

Использование Regex ниже - это способ

с поиском re.findall(r'\d+', "hello 12 hi 89")

re.findall(r'\b\d+\b', "hello 12 hi 89 33F AC 777")

repl_str = re.compile('\d+.?\d*') должно быть: repl_str = re.compile('\d+\.?\d*') Для воспроизводимого примера с использованием python3.7 re.search(re.compile(r'\d+.?\d*'), "42G").group() '42G' re.search(re.compile(r'\d+\.?\d*'), "42G").group() '42'

Вы можете искать все целые числа в строке через цифру, используя выражение findall.

На втором шаге создайте список res2 и добавьте найденные в строке цифры в этот список.

надеюсь это поможет

С уважением, Дивакар Шарма

Этот ответ также содержит случай, когда число находится в строке

Я поражен, увидев, что никто еще не упомянул об использовании itertools.groupby в качестве альтернативы для достижения этой цели.

Вы можете использовать itertools.groupby() наряду с str.isdigit() тем, чтобы извлечь числа из строки как:

Значение удержания l будет:

PS: Это просто для иллюстрации, чтобы показать, что в качестве альтернативы мы могли бы также использовать groupby для достижения этой цели. Но это не рекомендуемое решение. Если вы хотите добиться этого, вы должны использовать принятый ответ fmark, основанный на использовании понимания списка с использованием str.isdigit фильтра.

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

Чтобы поймать разные шаблоны, полезно запрашивать разные шаблоны.

Настройте все шаблоны, которые улавливают различные числовые шаблоны:

(находит запятые) 12 300 или 12 300,00

(находит поплавки) 0,123 или 0,123

(находит целые числа) 123

Объединить с трубой (|) в один шаблон с несколькими или условными .

(Примечание: сначала разместите сложные шаблоны, иначе простые шаблоны будут возвращать фрагменты сложного улова вместо сложного улова, возвращающего полный улов).

Ниже мы подтвердим наличие шаблона с re.search() , а затем вернем итеративный список уловов. Наконец, мы распечатаем каждый улов, используя скобочные обозначения, чтобы отобрать возвращаемое значение объекта сопоставления из объекта сопоставления.

Поскольку ни один из них не касался реальных финансовых показателей в Excel и документах Word, которые мне нужно было найти, вот мой вариант. Он обрабатывает целые числа, числа с плавающей запятой, отрицательные числа, номера валют (потому что он не отвечает при разделении), и имеет возможность удалить десятичную часть и просто вернуть целые числа или вернуть все.

Он также обрабатывает систему счисления индейцев лаков, где запятые появляются нерегулярно, а не через каждые 3 числа.

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

Это также не извлекает даты. Есть лучшие способы поиска дат в строках.


В этой статье мы расскажем, как можно разбивать строки на списки. Вы узнаете, как при этом использовать разделители (в частности — как отделять часть строки только по первому разделителю и как быть с последовательно идущими разделителями) и регулярные выражения. Безусловно, эта информация будет особенно полезна начинающим питонистам, но, возможно, и более опытные найдут для себя кое-что интересное.

Простое разделение строки и получение списка ее составляющих

Если вы хотите разбить любую строку на подстроки и составить из них список, вы можете просто воспользоваться методом split(sep=None, maxsplit=-1) . Этот метод принимает два параметра (опционально). Остановимся пока на первом из них — разделителе ( sep ).

Разделитель можно задать явно в качестве параметра, но можно и не задавать: в этом случае в его роли выступает пробел.

Пример использования метода split() без указания разделителя:

Разделение строки с использованием разделителя

Python может разбивать строки по любому разделителю, указанному в качестве параметра метода split() . Таким разделителем может быть, например, запятая, точка или любой другой символ (или даже несколько символов).

Давайте рассмотрим пример, где в качестве разделителя выступает запятая и точка с запятой (это можно использовать для работы с CSV-файлами).

Как видите, в результирующих списках отсутствуют сами разделители.

Если вам нужно получить список, в который войдут и разделители (в качестве отдельных элементов), можно разбить строку по шаблону, с использованием регулярных выражений (см. документацию re.split). Когда вы берете шаблон в захватывающие круглые скобки, группа в шаблоне также возвращается как часть результирующего списка.

Если вы хотите, чтобы разделитель был частью каждой подстроки в списке, можно обойтись без регулярных выражений и использовать list comprehensions:

Разделение многострочной строки (построчно)

Создать список из отдельных строчек многострочной строки можно при помощи того же метода split() , указав в качестве разделителя символ новой строки \n . Если текст содержит лишние пробелы, их можно удалить при помощи методов strip() или lstrip() :

Разделение строки-словаря и преобразование ее в списки или словарь

Допустим, у нас есть строка, по сути являющаяся словарем и содержащая пары ключ-значение в виде key => value . Мы хотим получить эти пары в виде списков или настоящего словаря. Вот простой пример, как получить словарь и два списка:

Отделение указанного количества элементов

Разделение строки при помощи последовательно идущих разделителей

Если вы для разделения строки используете метод split() и не указываете разделитель, то разделителем считается пробел. При этом последовательно идущие пробелы трактуются как один разделитель.

Но если вы указываете определенный разделитель, ситуация меняется. При работе метода будет считаться, что последовательно идущие разделители разделяют пустые строки. Например, '1,,2'.split(',') вернет ['1', '', '2'] .

Если вам нужно, чтобы последовательно идущие разделители все-таки трактовались как один разделитель, нужно воспользоваться регулярными выражениями. Разницу можно видеть в примере:

Лаборатория Django-разработки

За 3 месяца отработай навыки Django-разработки до профессионального уровня на серьезном проекте под руководством наставника.

Читайте также: