Перевод строк в числа: работа со списками Python
Основное решение: списковое включение (list comprehension)
Самым эффективным и читаемым способом преобразования списка строк в целые числа является использование спискового включения с функцией int().
string_list = ["10", "20", "30", "40", "50"]
int_list = [int(item) for item in string_list]
print(int_list) # [10, 20, 30, 40, 50]изменить тип в python (изменить тип в python)
Этот метод подходит, когда все строки гарантированно содержат корректные целые числа. Если хотя бы одна строка не может быть преобразована, возникнет исключение ValueError.
Проблема:
Если в списке есть строка, не являющаяся целым числом (например, "abc" или "12.5"), то выполнение прервется с ошибкой ValueError.
Решение:
Использовать обработку исключений внутри спискового включения (см. раздел вариантов).
Как преобразовать список строк в целые числа с помощью функции map?
Функция map применяет int к каждому элементу списка. Результат необходимо преобразовать в список.
string_list = ["1", "2", "3"]
int_list = list(map(int, string_list))
print(int_list) # [1, 2, 3]Python int to str (преобразование int в строку в python)
Этот способ также лаконичен, но при возникновении ошибки ведет себя аналогично списковому включению.
Проблема:
Такая же чувствительность к некорректным данным. Кроме того, map возвращает итератор, поэтому требуется явное преобразование в список.
Как преобразовать список строк в целые числа, отбрасывая некорректные элементы с помощью isdigit?
Можно объединить списковое включение с проверкой на возможность преобразования через str.isdigit(). Однако isdigit() не обрабатывает отрицательные числа и числа с плавающей точкой.
string_list = ["-5", "0", "42", "abc", "3.14"]
int_list = [int(item) for item in string_list if item.lstrip('-').isdigit()]
print(int_list) # [-5, 0, 42]
Python bytes to string (преобразование байтов в строку в python)
Важно: такой подход пропустит строки, содержащие десятичные точки (3.14) и не являющиеся числами. Для более надежной фильтрации следует использовать попытку преобразования с обработкой исключений.
Проблема:
Метод isdigit() не подходит для отрицательных чисел без предварительной обработки. Также он не различает целые и дробные числа.
Решение:
Использовать вспомогательную функцию с try-except.
Как использовать вспомогательную функцию с обработкой исключений для надежного преобразования?
Создайте функцию, которая пытается преобразовать строку в int, и в случае ошибки возвращает None или значение по умолчанию. Затем примените её.
def safe_int(s):
try:
return int(s)
except ValueError:
return None
string_list = ["10", "abc", "20", " 30 ", "12.5"]
int_list = [safe_int(item) for item in string_list if safe_int(item) is not None]
print(int_list) # [10, 20, 30]как выводить в строку python (преобразование вывода в строку в python)
Обратите внимание, что строка " 30 " была успешно преобразована, так как int игнорирует начальные и конечные пробелы. Строка "12.5" вызовет ValueError и будет пропущена.
Проблема:
Двойной вызов safe_int для каждого элемента (в условии if и в результате) неэффективен. Лучше использовать подход с назначением переменной в списочном включении (Python 3.8+).
Как применить моржовый оператор (walrus operator) для более эффективного преобразования?
В Python 3.8+ можно присвоить результат преобразования переменной прямо внутри включения.
string_list = ["10", "abc", "20"]
int_list = [val for s in string_list if (val := safe_int(s)) is not None]
print(int_list) # [10, 20]
Это позволяет избежать повторного вызова safe_int.
Проблема:
Моржовый оператор может снизить читаемость для начинающих. Однако он является стандартной идиомой для подобных случаев.
Каждый из описанных методов имеет свои области применения. Выбор зависит от требуемой обработки ошибок, версии Python и стиля кода.
Расширенные примеры преобразования
Пример 1: Обработка строк с пробелами и пустыми строками
Цель:
показать, что int() автоматически удаляет начальные и конечные пробелы, но пустая строка вызовет ошибку.data = [" 123 ", "456", "", " 789 ", "0"]
result = []
for s in data:
if s.strip(): # проверяем, что строка не пуста после удаления пробелов
try:
result.append(int(s))
except ValueError:
pass
print(result) # [123, 456, 789, 0]
[123, 456, 789, 0]
Пример 2: Использование filter и map для отбора чисел
Цель:
комбинировать фильтрацию и преобразование.data = ["10", "abc", "20", "30", "xyz"]
def is_integer_string(s):
try:
int(s)
return True
except ValueError:
return False
filtered = filter(is_integer_string, data)
int_list = list(map(int, filtered))
print(int_list) # [10, 20, 30]
[10, 20, 30]
Пример 3: Замена нечисловых строк на значение по умолчанию (например, 0)
data = ["1", "two", "3", "four", "5"]
int_list = []
for s in data:
try:
int_list.append(int(s))
except ValueError:
int_list.append(0)
print(int_list) # [1, 0, 3, 0, 5]
[1, 0, 3, 0, 5]
Пример 4: Преобразование с использованием пакета pandas (для больших данных)
Цель:
применение pd.to_numeric с обработкой ошибок.import pandas as pd
data = ["10", "20", "abc", "30"]
series = pd.to_numeric(data, errors='coerce') # некорректные становятся NaN
int_list = series.dropna().astype(int).tolist()
print(int_list) # [10, 20, 30]
[10, 20, 30]
Пример 5: Преобразование строк, содержащих числа в шестнадцатеричном формате
Цель:
использовать int с указанием основания.hex_strings = ["0xFF", "0x10", "0x1A"]
int_list = [int(s, 16) for s in hex_strings]
print(int_list) # [255, 16, 26]
[255, 16, 26]
Пример 6: Обработка списка строк с отрицательными числами и дробными числами (преобразование только целых)
data = ["-5", "3.14", "-10", "abc", "0"]
# вариант с предварительной проверкой
int_list2 = [int(s) for s in data if s.lstrip('-').isdigit() and '.' not in s]
print(int_list2) # [-5, -10, 0]
[-5, -10, 0]