Как поменять тип данных в списке python
Перейти к содержимому

Как поменять тип данных в списке python

  • автор:

ПРЕОБРАЗОВАНИЕ ТИПОВ ДАННЫХ В PYTHON

С помощью функции complex() удобно формировать комплексные числа, указывая через запятую два аргумента: действительную часть и мнимую часть.

a = complex(3.2, 1.5) print(a) 
(3.2+1.5j) 

Смешанная арифметика

Python поддерживает смешанную арифметику в выражениях, состоящих из чисел разных типов. При этом целочисленный тип (int) при необходимости расширяется до дробного (float), а дробный — до комплексного (complex). То же самое происходит при сравнении чисел разного типа.

Системы счисления

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

a = hex(38) print(a) 
0x26 

Преобразовать строковое представление недесятичного числа в десятичную систему можно с помощью функции int(), указав вторым аргументом основание системы счисления (от 2 до 36 включительно).

a = '0x26' b = int(a, base=16) print(b) 

Округление

Для округления чисел с плавающей точкой используется функция round(). Функция использует банковское округление (по Гауссу) до ближайшего чётного целого, чтобы избежать серийного накопления погрешности. Например, round(1.5) + round(2.5) будет равен 4. При обычном математическом округлении сумма округленных чисел будет равна 5.

С помощью второго аргумента функции round() можно округлить число до заданного количества знаков после запятой. Если воторой аргумент не задан, то число округляется до целого.

a = round(1.5) print(a) b = round(2.5) print(b) c = round(6.4567, 2) print(c) d = round(4.35, 1) print(d) e = round(4.45, 1) print(e) 
2 2 6.46 4.7 4.5 

Преобразование в строку

Для преобразования в строку используется функция str(). Аргументом функции str() может выступать число, строка, кортеж, список, множество, словарь, логическое значение, None.

Любой объект, преобразованный в строку, становится просто набором символов.

a = 5.3 x = str(a) print(x, type(a), type(x)) 

Преобразование в список

Для преобразования в список используется функция list(). Аргументом функции list() может выступать любой итерируемый тип данных (строка, кортеж, список, множество, словарь).

При преобразовании строки в список, мы получаем список, состоящий из символов строки.

Стоит обратить внимание на то, что при преобразовании словаря в список, в списке оказываются только ключи.

b = 'Python' x = list(b) print(x) c = (3, 4) x = list(c) print(x) d = [5, 6] x = list(d) print(x) e = x = list(e) print(x) f = x = list(f) print(x) 
['P', 'y', 't', 'h', 'o', 'n'] [3, 4] [5, 6] [8, 7] [1, 2] 

Преобразование в кортеж

Для преобразования в кортеж используется функция tuple(). Аргументом функции tuple() может выступать любой итерируемый тип данных (строка, кортеж, список, множество, словарь).

Преобразование в кортеж происходит по тому же принципу, по которому происходит преобразование в список.

Преобразование в множество

Для преобразования в множество используется функция set(). Аргументом функции set() может выступать любой итерируемый тип данных (строка, кортеж, список, множество, словарь).

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

a = [5, 6, 5, 6, 7] x = set(a) print(x) 

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

a = 227 x = set(str(a)) print(x) 

Преобразование в словарь

Для преобразования в словарь используется функция dict().

Для преобразования в словарь каждый элемент преобразуемой последовательности должен быть парой. Первым элементом в паре может быть любой неизменяемый тип данных (число, строка, кортеж), а вторым — любой тип данных.

f = [[1, 'яблоко'], [2, 'тыква']] x = dict(f) print(x) 

Преобразование в логический тип

Для преобразования в логический тип используется функция bool().

Функция bool() вернет False, если в качестве аргумента выступает пустая строка, нулевое число, None, пустой список, пустой кортеж или пустое множество. Непустая строка, ненулевое число, даже если оно отрицательное, вернут True. Непустое множество, непустой список или непустой кортеж, даже если они содержат один пустой элемент, вернут True.

a = -7 x = bool(a) print(x) b = '' x = bool(b) print(x) c = x = bool(c) print(x) 
True False True 

Преобразование типов данных в Python 3

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

Данное руководство научит вас преобразовывать числа, строки, кортежи и списки.

Читайте также: Типы данных в Python 3

Преобразование числовых типов

В Python существует два числовых типа данных: целые числа и числа с плавающей точкой. Для преобразования целых чисел в числа с плавающей точкой и наоборот Python предоставляет специальные встроенные методы.

Преобразование целых чисел в числа с плавающей точкой

Метод float() преобразовывает целые числа в числа с плавающей точкой. Число указывается в круглых скобках:

Это преобразует число 57 в 57.0.

Также можно использовать переменные. Объявите переменную f = 57, а затем выведите число с плавающей точкой:

f = 57
print(float(f))
57.0

Преобразование чисел с плавающей точкой в целые числа

Встроенная функция int() предназначена для преобразования чисел с плавающей точкой в целые числа.

Функция int() работает так же, как и float(). Чтобы преобразовать число, добавьте его в круглые скобки:

Число 390.8 преобразуется в 390.

Эта функция также может работать с переменными. Объявите переменные:

b = 125.0
c = 390.8

Затем преобразуйте и отобразите их:

print(int(b))
print(int(c))
125
390

Чтобы получить целое число, функция int() отбрасывает знаки после запятой, не округляя их (потому 390.8 не преобразовывается в 391).

Преобразование чисел с помощью деления

При делении Python 3 может преобразовать целое число в число с плавающей точкой (в Python 2 такой функции нет). К примеру, разделив 5 на 2, вы получите 2.5.

Python не преобразовывает тип данных во время деления; следовательно, деля целое число на целое число, в результате вы получили бы целое число, 2.

Преобразование строк

Строка – это последовательность из одного или больше символов (цифр, букв и других символов). Строки – очень распространённый тип данных в программировании. Существует много способов преобразования строк.

Преобразование чисел в строки

Чтобы конвертировать число в строку, используйте метод str(). Поместите число или переменную в круглые скобки.

Попробуйте преобразовать целое число, например:

Запустив метод str(12) в интерактивной оболочке Python (с помощью команды python), вы получите вывод:

Кавычки означают, что теперь 12 является строкой, а не числом.

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

user = «Michael»
lines = 50
print(«Congratulations, » + user + «! You just wrote » + lines + » lines of code.»)

Запустив этот код, вы получите ошибку:

TypeError: Can’t convert ‘int’ object to str implicitly

Python не может склеивать строки с числами, потому нужно преобразовать значение lines в строку.

user = «Michael»
lines = 50
print(«Congratulations, » + user + «! You just wrote » + str(lines) + » lines of code.»)

Теперь, запустив код, вы увидите:

Congratulations, Michael! You just wrote 50 lines of code.

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

print(str(421.034))
f = 5524.53
print(str(f))
421.034
5524.53

Попробуйте выполнить конкатенацию строки и преобразованного в строку числа:

f = 5524.53
print(«Michael has » + str(f) + » points.»)
Michael has 5524.53 points.

Преобразование строк в числа

Строки можно преобразовать в числа с помощью методов int() и float()

Если в строке нет десятичных знаков, лучше преобразовать её в целое число. Для этого используется int().

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

lines_yesterday = «50»
lines_today = «108»
lines_more = lines_today — lines_yesterday
print(lines_more)
TypeError: unsupported operand type(s) for -: ‘str’ and ‘str’

При запуске возникла ошибка, поскольку Python не может выполнить сложение строк. Преобразуйте строки в числа и попробуйте снова запустить программу:

lines_yesterday = «50»
lines_today = «108»
lines_more = int(lines_today) — int(lines_yesterday)
print(lines_more)
58

Значение переменной lines_more – это число, в данном случае это 58.

Также можно преобразовать числа в предыдущем примере в числа с плавающей точкой. Для этого используйте метод float() вместо int().

К примеру, очки начисляются в десятичных значениях.

total_points = «5524.53»
new_points = «45.30»
new_total_points = total_points + new_points
print(new_total_points)
5524.5345.30

В данном случае оператор + склеивает две строки, а не складывает числа. Потому в результате получилось довольно странное значение.

Конвертируйте эти строки в числа с плавающей точкой, а затем выполните сложение.

total_points = «5524.53»
new_points = «45.30»
new_total_points = float(total_points) + float(new_points)
print(new_total_points)
5569.83

Как видите, теперь программа возвращает ожидаемый результат.

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

f = «54.23»
print(int(f))
ValueError: invalid literal for int() with base 10: ‘54.23’

Преобразование в кортежи и списки

Чтобы преобразовать данные в кортеж или список, используйте методы tuple() и list() соответственно. В Python:

  • Список – это изменяемая упорядоченная последовательность элементов, взятая в квадратные скобки ([ ]).
  • Кортеж – неизменяемая упорядоченная последовательность элементов, взятая в круглые скобки.

Преобразование списка в кортеж

Преобразовывая список в кортеж, вы можете оптимизировать программу. Для преобразования в кортеж используется метод tuple().

print(tuple([‘pull request’, ‘open source’, ‘repository’, ‘branch’]))
(‘pull request’, ‘open source’, ‘repository’, ‘branch’)

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

Попробуйте использовать tuple() с переменной:

sea_creatures = [‘shark’, ‘cuttlefish’, ‘squid’, ‘mantis shrimp’] print(tuple(sea_creatures))
(‘shark’, ‘cuttlefish’, ‘squid’, ‘mantis shrimp’)

В кортеж можно преобразовать любой итерируемый тип, включая строки:

Конвертируя в кортеж числовой тип данных, вы получите ошибку:

print(tuple(5000))
TypeError: ‘int’ object is not iterable

Преобразование в списки

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

Обратите внимание: при этом в методах list() и print() используется две пары круглых скобок. Одни принадлежать собственно методу, а другие – кортежу.

print(list((‘blue coral’, ‘staghorn coral’, ‘pillar coral’)))
[‘blue coral’, ‘staghorn coral’, ‘pillar coral’]

Если данные, которые вывел метод print, заключены в квадратные скобки, значит, кортеж преобразовался в список.

Чтобы избежать путаницы с круглыми скобками, можно создать переменную:

coral = (‘blue coral’, ‘staghorn coral’, ‘pillar coral’)
list(coral)

Строки тоже можно преобразовывать в списки:

Заключение

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

Модификация списков поэлементно — Python: Списки

Как вы помните, элементы списков индексированы, то есть каждый элемент имеет порядковый номер. Первый элемент имеет индекс 0 , последний — len(list) — 1 .

Функция len возвращает длину списка, но работает она с различными типами, например — со строками и кортежами.

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

Последний элемент списка будет иметь отрицательный индекс -1 . Увы, -0 использовать не получится. Вот пара примеров использования индексов со списком:

l = [0] * 3 l[0], l[1] = 10, 32 l[-1] = l[0] + l[1] print(l) # => [10, 32, 42] 

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

pop и insert

Итак, получать и заменять элементы по одному мы умеем. Неплохо бы еще уметь удалять старые элементы и вставлять в середину списка новые. За это отвечают методы pop и insert соответственно. pop удаляет элемент по индексу.

Если не указать индекс, то удаляется последний элемент. При этом pop возвращает значение элемента, который удаляет:

l = [1, 2, 3] l.pop() # 3 print(l) # => [1, 2] l.pop(0) # 1 print(l) # => [2] 

А вот пример использования insert :

l = [1, 2, 3] l.insert(1, 100) print(l) # => [1, 100, 2, 3] l.insert(-1, 200) print(l) # => [1, 100, 2, 200, 3] 

insert всегда вставляет новый элемент перед элементом с указанным индексом относительно начала списка. При этом не важно, откуда мы индекс отсчитывали — от начала или от конца. И insert(-1, ..) вставляет элемент именно перед последним элементом.

Интересно, что l.insert(len(l), x) добавит элемент x в конец списка l , то есть сработает как l.append(x) .

Фактически здесь не будет элемента, перед которым будет вставлен новый, вот новый элемент и попадет в конец списка.

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

Ошибки индексации

Если попытаться вызвать pop() у пустого списка или указать индекс за пределами индексов существующих элементов, вы получите ошибку IndexError :

l = [] l.pop() # Traceback (most recent call last): # File "", line 1, in # IndexError: pop from empty list 

А вот insert более терпим к некорректным индексам и просто добавляет элементы с соответствующего края:

l = [0] l.insert(-500, 1) l.insert(1000, 2) print(l) # => [1, 0, 2] 

Однако полагаться на это не стоит — индексы все же лучше держать под контролем.

Сортировка и разворачивание

Списки чего-либо периодически приходится сортировать, а иногда и разворачивать. Желательно уметь это делать эффективно. Поэтому список уже имеет встроенные средства для выполнения обеих задач — методы sort и reverse . Оба метода изменяют список по месту. Посмотрим на несколько примеров:

l = [1, 3, 7, 2, 10, 8] l.sort() print(l) # => [1, 2, 3, 7, 8, 10] l.reverse() print(l) # => [10, 8, 7, 3, 2, 1] 

Эти методы могут работать без параметров. В случае reverse нечего и параметризовывать: разворачивание — это всегда разворачивание.

А вот сортировка может производиться по разным критериям. Если вызывать sort без параметров, то элементы сортируются в порядке возрастания. Однако методу можно передать параметр-функцию, которая будет возвращать критерий сортировки, то есть ключ.

Функция будет вызвана по одному разу для каждого элемента списка, после чего элементы будут отсортированы по возрастанию значения ключа. Давайте объявим функцию, которая будет возвращать остаток от деления аргумента на два, и используем ее в роли ключа:

def mod2(x): return x % 2 l = [1, 2, 3, 6, 5, 4] l.sort(key=mod2) print(l) # => [2, 6, 4, 1, 3, 5] 

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

Функция mod2 вернула для четных и нечетных чисел 0 и 1 соответственно. Поэтому в начале списка оказались сначала четные числа.

Интересно, что в пределах своей группы числа сохранили порядок: 6 шла в списке перед 4 , и это взаимное расположение сохранилось.

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

Сортировка в этом случае называется стабильной — и в Python сортировка именно такая.

Функция-ключ не обязана возвращать числа — она может возвращать любые значения, которые Python умеет сравнивать. Давайте в предыдущем примере усложним функцию-ключ:

def key(x): return (x % 2, x) l = [1, 2, 3, 6, 5, 4] l.sort(key=key) print(l) # => [2, 4, 6, 1, 3, 5] 

Теперь числа разбиты на группы и при этом еще и отсортированы внутри групп. Когда Python сравнивает кортежи, он сравнивает сначала первые элементы, а если те равны — вторые и так далее.

Значения сравниваются, пока не найдется первое неравенство. Либо пока не кончится один из кортежей — в этом случае более короткий будет меньше. Вот несколько примеров:

print((1, 2, 3)  (1, 2, 4)) # => True print((1, 1)  (1, 1, 1)) # => True print((1, 2) > (1, 1, 1)) # => True print((3, 4, 5) == (3, 4, 5)) # => True 

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов

Наши выпускники работают в компаниях:

Перевод списка строк в список чисел

Во многих языках когда используется цикл вида for-in элементы оисходной последовательности являются неизменяемыми. То есть вы имеете дело с копиями элементов. Я не знаю Python, но, думаю, здесь имеет место тоже самое.

18 окт 2015 в 21:13
Возможно, вам будет полезен этот ответ
18 окт 2015 в 22:50

5 ответов 5

Сортировка: Сброс на вариант по умолчанию

Наиболее идиоматический и идеологически выверенный способ:

result = [int(item) for item in a] 

Для любителей функционального стиля:

result = list(map(int, a)) 

Тут функция map применяет функцию int к каждому элементу объекта a , потом результат преобразовывается в список.

Такой вариант считается менее «питоничным», но тоже имеет право на существование (как минимум, во многих случаях запись через map получается более компактной, чем вариант через списочное выражение).

По поводу вашего первого варианта: когда вы пишете for el in a , то каждый раз в цикле в el записывается ссылка на элемент списка. Но когда вы пишете el = int(el) , то в переменную el просто записывается другая ссылка, сам элемент списка не меняется.

Как понять, что это именно ссылка, а не копия элемента? Вот пример, как при помощи вызова метода элемента списка меняется сам элемент:

>>> a = [[], [], []] >>> for el in a: el.append(1) >>> a [[1], [1], [1]] 

По поводу вашего ответа, перебор со счетчиком (если он вам вдруг действительно понадобится) на Python правильнее (проще и приятнее, без всяких len вложенных в range) делать через enumerate:

for i, item in enumerate(a): a[i] = int(item) 

Отслеживать
ответ дан 18 окт 2015 в 23:22
49.3k 17 17 золотых знаков 57 57 серебряных знаков 101 101 бронзовый знак

Различные способы выполнить это преобразование:

    Изменяя непосредственно элементы массива

for i, elem in enumerate(array): array[i] = int(elem) 
array = [int(elem) for elem in array] 
array = list(map(int, array)) 

Вот более подробное объяснение происходящего:

Для начала вспомним, что все переменные в Python являются ссылками на объекты.

Пусть у нас будет массив array со следующим содержимым:

array = ['10', '11', '12'] 

Вот как это будет представляться в памяти в Python ( idN — это адрес объекта в памяти):

визуализация массива

Заметьте, что строки не хранятся напрямую в списке, они хранятся снаружи, а в списке есть указатели на них.

Когда вы перебираете значения в цикле, например,

for elem in array: elem = int(elem) 

На каждой итерации переменная elem просто будет указывать на текущее число массива array .

Например, на первой итерации:

elem указывает на первую строку

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

elem указывает на новый объект

Заметьте, что в массиве при этом ссылка не меняется, и нулевой элемент как указывал на строку «10» , так и продолжает на неё указывать:

array[0] указывает всё ещё на старый объект

Т.е. наша задача на самом деле заключается в том, чтобы заменить ссылку, хранящуюся в списке array на новую, т.е. в нашей визуализации на id5 .

Чтобы это сделать, нам нужно получить доступ на запись в конкретную ячейку списка. Список позволяет сделать это через доступ по индексу. Напишем следующий код (подобный которому как раз используется вами в собственном ответе):

array = ['10', '11', '12'] for i in range(len(array)): old_value = array[i] new_value = int(old_value) array[i] = new_value 

Я расписал в несколько строк для наглядности.

Здесь на первой итерации цикла мы получаем переменную i , хранящую не ссылку на строку, а позицию в списке array , в которой нам нужно заменить ссылку:

переменная i хранит число 0, а не ссылку на строку

Далее получаем строку, хранящуюся по этому индексу для того, чтобы преобразовать её в число (здесь она сохраняется в отдельной переменной, в вашем коде это будет временный объект):

old_value = array[i] 

old_value указывает на строку в списке

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

new_value = int(old_value) 

new_value указывает на полученное число

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

array[i] = new_value 

изменили первое значение в списке

Таким образом и производится изменение значений массива.

Приведу для сравнения краткую запись этого кода:

for i in range(len(array)): array[i] = int(array[i]) 

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

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

for i, elem in enumerate(array): array[i] = int(elem) 

Функция enumerate для нашего списка вернёт последовательность вида

[(0, '10'), (1, '11'), (2, '12')] 

Такой цикл избавляет нас от необходимости писать самостоятельно доступ по индексу массива. Важно понимать, что переменная elem и здесь не даёт нам доступа на запись в массив, она просто хранит указатель на объект, хранящийся по текущему индексу в списке.

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

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

Если же нам не требуется изменять этот список, а достаточно создания нового, в котором будут храниться целочисленные представления соответствущих элементов, то можно воспользоваться встроенной функцией map , как предложил @ReinRaus:

array = list(map(int, array)) 

Только стоит помнить, что в Python 3 функция map возвращает генератор, поэтому стоит явно преобразовать результат в список.

Ещё один удобный способ получения такого же результата, это использование генератора списков:

array = [int(elem) for elem in array] 

Оба этих решения эквивалентны и являются аналогом следующего кода:

result_array = [] for elem in array: result_array.append(int(elem)) array = result_array 

Эти решения оставляют исходный список неизменным, создавая новый и только после присваивая его переменной array .

Продемострирую разницу этих способов на примере:

array = ['10', '11', '12'] link = array 

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

обе переменных указывают в одно и то же место

Выполним преобразование, изменяя элементы списка:

array = ['10', '11', '12'] link = array print(array, link) # ['10', '11', '12'] ['10', '11', '12'] for i, elem in enumerate(array): array[i] = int(elem) print(array, link) # [10, 11, 12] [10, 11, 12] 

Как мы видим, массив непосредственно изменился, а вместе с ним изменились данные, которые доступны по переменным, указывающим на этот список:

изменились значения элементов списка

Если же воспользоваться вторым способом

array = ['10', '11', '12'] link = array print(array, link) # ['10', '11', '12'] ['10', '11', '12'] array = list(map(int, array)) print(array, link) # [10, 11, 12] ['10', '11', '12'] 

то ещё по выводу программы можно заметить, что содержимое исходного списка не изменилось. Итоговая картина объектов будет выглядеть так:

введите сюда описание изображения

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

Для визуализации использовался сервис pythontutor.com.

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

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