본문 바로가기
Language/Python

[Python] 리스트 comprehension (2)/ 예제로 공부하는 Python 100 문제풀이

by 애기 개발자 2022. 2. 17.
반응형

2022.02.17 - [개발/Python] - [Python] 리스트 comprehension (1)/ 예제로 공부하는 Python 100 문제풀이

 

[Python] 리스트 comprehension (1)/ 예제로 공부하는 Python 100 문제풀이

리스트를 생성하는데 다양한 방법이 있다. 그중 우리는 comprehension 이라는 새로운 방법을 익힐것이다. 우선 comprehension의 뜻은 가장 많이 쓰이는 뜻은 이해, 이해력이지만 여기선 포함, 포괄, 함축

baby-dev.tistory.com

 

지난 글에 이어서 이번엔 응용편으로 들어가 본다.

 

공부하고 있는게 '예제로 공부하는' 이기 때문에 응용은 예제로 들어간다.

 

1. [ ]를 사용하지 않고 list()와 for 문으로 리스트 만들기

처음에는 아직 익숙하지 않은 파이썬의 문법에 어.. 뭐지? 했으나 금방 하는방법을 알았다.

 

#괄호 [] 를 사용하지 않고 list() 와 for 문으로 1~10 리스트 만들기
a = list(i for i in range(1, 11))
print('a - ',a, type(a))

list( )를 선언해주고 그 안에 comprehension을 사용하여 반복문을 돌려주면 된다.

 

2. 1~10 제곱

아마 다른 언어를 공부해봤거나, 센스가 있다면 쉽게 생각해낼 수 있다.

 

# 1~10 각 숫자 제곱한 리스트
b = [i*i for i in range(1, 11)] #i**2, pow(i, 2) 도 가능
print('b - ', b, type(b))

기존에는 i for i in range(1, 11)  를 사용한것에 앞의 i만 i*i 로 바꿔주면 된다.

 

뒤의 주석으로 알 수 있듯이

 

앞서 연산자 항목에서 배웠던  i**2또한 가능하며, 제곱을 해주는 내장함수인 pow(i, 2)를 사용해도 동일한 결과값이 나온다.

 

3. 1~10 제곱, 5의 제곱은 제외

이 문항은 comprehension 뒤에 if문까지 쓸 수 있냐를 물어보는 것이다.

 

방법은 간단하다. 그냥 뒤에 붙여주면 된다.

 

# 1~10 각 숫자 제곱, 5의 제곱 제외
c = [i*i for i in range(1, 11) if i != 5 ]
print('c - ', c, type(c))

if i != 5 를 통해서 5가 아닌 숫자만 출력시킨 것이다.

 

4. 1~50 짝수, 홀수만 출력

이것은 위 3번 문항의 아주 살짝 응용편이라고 생각하면 된다.

 

홀수

d = [i for i in range(1, 51) if i % 2]
print('d 홀수- ', d, type(d))

짝수

d_2 = [i for i in range(1, 51) if i % 2 == 0]
print('d_2 짝수- ', d_2, type(d_2))

 

???: 짝수에서는 i % 2 == 0 까지 붙여줬는데 홀수에서는 뒤에 없는데 어캐 나옴??

 

홀수인 수를 2로 나눳을때 나머지는 반드시 1이 나온다. 이때 대부분의 프로그래밍 언어들은 0을 제외한 다른 수는 true 로 인식하기 때문에 가능하다.

 

짝수일 때는 i % 2 == 0 까지 해 줘야 짝수인 수만 출력이 된다.

 

5. 함수 사용

출력되는 부분에 앞서 언급된  pow( )를 비롯한 다른 내장함수 또는 직접만든 함수의 사용이 가능하다.

 

예시로 음수가 포함된 리스트에서 절대값을 출력하는 코드이다.

 

# 함수 사용
e = [abs(i) for i in [1, 2, -3, 4, 5, -6, 7, 8, -9 ,10]]
print('e 절대값- ', e)

직접만든 함수를 사용하는 방법은

 

e = [my_func(i) for i in [1, 2, -3, 4, 5, -6, 7, 8, -9, 10]]

 

위처럼 사용하면 된다.

 

6. 중첩 반복문

반복문을 썻다면 당연히 반복문의 중첩도 되어야 하지 않겠는가?

 

쌉가능 하다.

 

처음엔 단순하게

 

f = [i, j for i in range(3) for j in range(3)]

 

위의 코드를 호기롭게 쓴 후 실행시켰으나 에러가 발생하였다.

 

i, j 이렇게 쓰면 에러가 발생한다. 그럼 뒤에 넣으면 괜찮지 않을까??

 

f = [i for i in range(3) j for j in range(3)]

당연하지만 이 또한 에러가 난다.

 

그럼 어떻게 해야 하느냐?

 

리스트 안에 다른 타입을 만들어 주면 된다.

 

# 중첩 반복문
f = [(i, j) for i in range(3) for j in range(3)]
print('f - ', f, type(f))

리스트 안에 튜플을 사용하여 (i, j) 를 만들어 주었다. 위 처럼 하면 에러가 발생하지 않는다.

 

이상 끗

 

Git - 17 리스트 컴프리헨션, list comprehension (2).py

반응형

댓글