Как преобразовать list в int python
Перейти к содержимому

Как преобразовать list в int python

  • автор:

Как преобразовать список в диапазон?

trapwalker

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

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

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

В этом посте мы обсудим, как преобразовать список строк в список целых чисел в Python.

Например, список [«1», «2», «3», «4», «5»] следует преобразовать в список [1, 2, 3, 4, 5] .

1. Использование map() функция

Рекомендуемое решение — вызвать встроенную функцию map() для эффективного преобразования списка строк в список целых чисел. Он применяет указанную функцию к каждому элементу списка, получая результаты. Поскольку он возвращает итератор, преобразуйте результат в список. Эта функция показана ниже:

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

Во многих языках когда используется цикл вида 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
47.8k 17 17 золотых знаков 56 56 серебряных знаков 100 100 бронзовых знаков

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

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

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.

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

Преобразование str в int
Добрый день, гуру программирования. Прошу помочь в такой проблеме. Мне необходимо сделать.

Преобразование типов int в str
Ребята как здесь реализовать правильно преобразование int в str;.

Задача на преобразование str в int
Задание подробно описано внутри алгоритма задачи.. Помогите найти ошибку чего то я где-то.

Вывод числа в drawstring, преобразование str в double и int
не работает прогррамма можеть кто поможет namespace WindowsFormsApplication12 < public.

Преобразование списка из String в int
Добрый день. Подскажите пожалуйста, в чем ошибка, у меня есть ArrayList со значениями,которые.

Автоматизируй это!

Эксперт Python

7054 / 4559 / 1207
Регистрация: 30.03.2015
Сообщений: 13,132
Записей в блоге: 29
устали мы с тобой, почему не читаешь?

ЦитатаСообщение от Mindfure Посмотреть сообщение

Выдает ошибку invalid literal for int() with base 10: ‘(1,’

что тут не так? перевел? давай подумаем вместе! хммм. чет он скобку показывает. О! Идея — может он не может скобку превратить в инт? как думаешь?
может удалить из строки скобки перед тем как сплитить по запятой? подчеркиваю — сплит надо делать по запятой а не пробелу

954 / 340 / 114
Регистрация: 04.08.2018
Сообщений: 2,533

Welemir1, я чего-та не понимаю, но то, что у него уже в инте, ведь если нет, то должно быть так:

если так: (0, 2, 4, 1, 3), то просто цикл перебора элементов, они уже в инт.

Добавлено через 1 минуту
Получается у него кортеж, то там всё равно инты.

Добавлено через 9 секунд

Автоматизируй это!

Эксперт Python

7054 / 4559 / 1207
Регистрация: 30.03.2015
Сообщений: 13,132
Записей в блоге: 29

ЦитатаСообщение от Damenikx Посмотреть сообщение

я чего-та не понимаю,
да, у него ‘(0, 2, 4, 1, 3)’
Регистрация: 25.09.2016
Сообщений: 324

Damenikx, Нет, я отправил это серверу, а он преобразовал в str

conn.send((str)(key).encode('utf-8'))

Принятие клиентом:

data2 = sock.recv(16384) str2 = (data2.decode('utf-8'))

Автоматизируй это!

Эксперт Python

7054 / 4559 / 1207
Регистрация: 30.03.2015
Сообщений: 13,132
Записей в блоге: 29
просто он пишет список, приводит кортеж, а имеет в виду строку))) классика
Регистрация: 25.09.2016
Сообщений: 324
Welemir1, Из-за передачи она может полностью стать str?
954 / 340 / 114
Регистрация: 04.08.2018
Сообщений: 2,533

ЦитатаСообщение от Welemir1 Посмотреть сообщение

просто он пишет список, приводит кортеж, а имеет в виду строку))) классика

Я поэтому 3 раза читаю, 3 раза понять не могу.

Добавлено через 7 минут
Mindfure, вот: (сейчас Welemir1 будет ругаться )

1 2 3 4 5 6 7 8
str2 = '(1, 2, 3, 4, 5)' res1 = str2.replace('(',"") res2 = res1.replace(')',"") print(res2) for i in res2.split(', '): s = int(i) print(s)

Регистрация: 13.02.2016
Сообщений: 147

ЦитатаСообщение от Mindfure Посмотреть сообщение

Welemir1, Из-за передачи она может полностью стать str?
Не только может но и непременно станет
954 / 340 / 114
Регистрация: 04.08.2018
Сообщений: 2,533

Лучший ответ

Сообщение было отмечено Mindfure как решение

Решение

Mindfure, кучу переменных можно не делать, это я для вас, чтобы вы видели, как это происходит. Можно менять сразу же получившуюся строку:

1 2 3 4 5 6 7 8
str2 = '(1, 2, 3, 4, 5)' str2 = str2.replace('(', "") str2 = str2.replace(')', "") for i in str2.split(', '): s = int(i) print(type(s))

Добавлено через 1 минуту
Ещё можно через регулярки.

Добавлено через 4 минуты
Через регулярки, вот:

1 2 3 4 5 6
import re str2 = '(1, 2, 3, 4, 5)' line = re.sub('[(),]', '', str2) for i in line.split(' '): s = int(i) print(type(s), s)

Добавлено через 4 минуты
Ну и на закуску:

1 2 3 4
import re str2 = '(1, 2, 3, 4, 5)' x = [int(i) for i in re.sub('[(), ]', '', str2)] for i in x: print(type(i), i)

Регистрация: 25.09.2016
Сообщений: 324
Damenikx, Да, спасибо большое
4459 / 3212 / 1125
Регистрация: 21.03.2016
Сообщений: 7,949
Mindfure, а что бы не плясать с бубном передавайте объект
клиент

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
import socket import pickle sock = socket.socket() sock.connect(('localhost', 9090)) obj = { 'a': 1, 'b': [2, 3], 'c': { 'c1': 'abc', } } print('Send:', obj) data = pickle.dumps(obj) sock.sendall(data) print('Close') sock.close()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
import pickle BUFFER_SIZE = 4096 import socket sock = socket.socket() sock.bind(('', 9090)) sock.listen(1) print('Sock name: <>'.format(sock.getsockname())) while True: conn, addr = sock.accept() print('Connected:', addr) all_data = bytearray() while True: data = conn.recv(BUFFER_SIZE) if not data: break print('Recv: <>: <>'.format(len(data), data)) all_data += data print('All data (<>): <>'.format(len(all_data), all_data)) obj = pickle.loads(all_data) print('Obj:', obj) print('Close') conn.close()

результат
клиент
Send: >
Close
сервер
Sock name: (‘0.0.0.0’, 9090)
Connected: (‘127.0.0.1’, 2602)
Recv: 66: b’\x80\x03>q\x00(X\x01\x00\x00\x00aq\x01K\x01X\x01\x00\x00\x00bq\x02]q\x03(K\x02K\x03eX\x01\x00\x00\x00cq\x04>q\x05X\x02\x00\x00\x00c1q\x06X\x03\x00\ x00\x00abcq\x07su.’
All data (66): b’\x80\x03>q\x00(X\x01\x00\x00\x00aq\x01K\x01X\x01\x00\x00\x00bq\x02]q\x03(K\x02K\x03eX\x01\x00\x00\x00cq\x04>q\x05X\x02\x00\x00\x00c1q\x06X\x03\x00\ x00\x00abcq\x07su.’
Obj: >
Close

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

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