모든 목록 요소에서 int () 함수를 호출 하시겠습니까?


184

숫자 문자열이있는 목록이 있습니다.

numbers = ['1', '5', '10', '8'];

모든 목록 요소를 정수로 변환하고 싶으므로 다음과 같습니다.

numbers = [1, 5, 10, 8];

루프를 사용하여 다음과 같이 할 수 있습니다.

new_numbers = [];
for n in numbers:
    new_numbers.append(int(n));
numbers = new_numbers;

너무 못 생겼나요? 한 줄의 코드로이를 수행하는 더 파이썬적인 방법이 있다고 확신합니다. 도와주세요.


1
어떤 버전의 Python을 사용하고 있습니까?
Mark Byers

답변:



131

Python 2.x에서 또 다른 접근법은 다음을 사용하는 것입니다 map.

numbers = map(int, numbers)

참고 : Python 3.x map에서는 원하는 경우 목록으로 변환 할 수있는 맵 객체를 반환합니다.

numbers = list(map(int, numbers))

11
Python 3.x에서는 map목록 대신 반복자를 반환하므로 list(map(int, numbers))목록이 필요한 것처럼 작성해야 합니다.
kennytm

2
나는 현재 목록 이해 접근법이 조금 더 선호된다고 생각합니다.
extraneon

3
@extraneon : 예 ... 또는 사용 용도에 따라 목록 대신 생성기를 사용하는 것이 좋습니다. 발전기의 장점은 모든 요소를 ​​볼 필요가 없다면 미리 계산하는 데 시간을 낭비 할 필요가 없다는 것입니다.
Mark Byers

4
Python 2.7.2에서 timeit로 측정 : LC : 3.578153133392334,지도 : 4.9065070152282715
AJJ

1
@AJJ : map 설정 오버 헤드가 높지만 참조 인터프리터에서 변환 함수가 C로 구현 된 Python 내장 함수 인 경우 항목 당 비용이 낮습니다. 4 개의 값만 입력하면 테스트가 스케일링에 유용한 정보를 제공하지 않습니다. 즉, 내 자신의 테스트 (Py2.7.12 및 Py3.5.2, 후자는 list()랩핑 포함)에서 Py2 map는 4 개의 요소 입력에서도 승리했으며 Py3의 작은 마진만큼만 손실됩니다. 귀하의 테스트가 listcomp를 선호하여 뒤틀린 것 같습니다.
ShadowRanger

21

요점 만

numbers = [int(x) for x in numbers]

목록 이해력이 더 자연스럽고

numbers = map(int, numbers)

가 더 빠르다.

아마도 이것은 대부분의 경우 중요하지 않을 것입니다

유용한 읽기 : LP 대 맵


6
숫자 = map (int, number)이 아니어야합니까?
Karan

9

해당 정수를 함수 또는 메소드에 전달하려는 경우 다음 예제를 고려하십시오.

sum(int(x) for x in numbers)

이 구성은 의도적으로 adamk가 언급 한 목록 이해와 매우 유사합니다. 대괄호가 없으면 생성기 표현식 이라고하며 인수 목록을 메소드에 전달하는 매우 메모리 효율적인 방법입니다. 여기서 좋은 토론을 볼 수 있습니다 : 제너레이터 표현식과리스트 이해


4

파이썬 3에서 만드는 또 다른 방법 :

numbers = [*map(int, numbers)]


1
이것을 설명 할 수 있습니까? 나는 그 구문에 익숙하지 않다. 감사!
abalter

1
나는 인수 목록 (풀고 사용하고 docs.python.org/3/tutorial/... )
zhukovgreen

아하, 파이썬 3 일. []인수 목록 을 갖는 것이 이상 합니다. 그리고 반복자를 인수 목록으로 전달할 수 있다는 것을 몰랐습니다. 나는 생각했다 number = list(map(int, numbers)). 그러나 설명 주셔서 감사합니다!
abalter

3

또 다른 방법,

for i, v in enumerate(numbers): numbers[i] = int(v)

6
영업 이익은 말했다 파이썬
SilentGhost

3
이 방법은 목록의 일부 요소에서만 작업을 실행하려는 경우에 매우 유용합니다. 이것은이 글의 질문과 관련이 없지만 도움이되는 경우가있을 수 있습니다
Dikla

1

답변을 정리하고 일부를 보여줄 것이라고 생각했습니다. timeit 결과를 .

파이썬 2는 이것에 꽤 나쁘지만 map이해력보다 약간 빠릅니다.

Python 2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 20:42:59) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import timeit
>>> setup = """import random
random.seed(10)
l = [str(random.randint(0, 99)) for i in range(100)]"""
>>> timeit.timeit('[int(v) for v in l]', setup)
116.25092001434314
>>> timeit.timeit('map(int, l)', setup)
106.66044823117454

파이썬 3 자체는 4 배 이상 빠르지 만 map생성기 객체를 목록으로 변환하는 것이 여전히 이해력보다 빠르며 map생성기 를 풀고 (Artem! 덕분에) 목록을 생성하여 목록을 생성하는 것이 약간 더 빠릅니다.

Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 17:54:52) [MSC v.1900 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import timeit
>>> setup = """import random
random.seed(10)
l = [str(random.randint(0, 99)) for i in range(100)]"""
>>> timeit.timeit('[int(v) for v in l]', setup)
25.133059591551955
>>> timeit.timeit('list(map(int, l))', setup)
19.705547827217515
>>> timeit.timeit('[*map(int, l)]', setup)
19.45838406513076

참고 : 파이썬 3에서 4 요소는 이해력이 약간 더 빠르지 만 교차 요소 (파이썬 2에서는 3) 인 것처럼 보입니다. 생성자를 풀면 여전히 요소가 2 개 이상인 목록의 경우보다 빠릅니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.