Programming/Python

[코딩도장-파이썬] 리스트(List)와 튜플(Tuple) 응용하기 3

Supreme_YS 2020. 11. 19. 23:02

*shell 환경이 아닌 스크립트(script) 환경에서 작업했기 때문에 print 함수로 출력했습니다.

shell 환경이라면 print 함수는 생략 가능합니다.


1. 리스트 컴프리헨션(list comprehension) : 리스트 안에 식, for 반복문, if 조건문 등을 지정하여 리스트를 생성하는것. 리스트 안에 for 반복문과 if 조건문을 사용할 수 있다는 점은 파이썬의 특징.

 

  • [식 for 변수 in 리스트]
  • list(식 for 변수 in 리스트)
a = [i for i in range(10)] # 0부터 9까지 숫자를 생성하여 리스트 생성

print(a)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
b = list(i for i in range(10)) # 0부터 9까지 숫자를 생성하여 리스트 생성 

print(b)
리스트 안에 식, for, 변수, in, 리스트 순서로 들어있지만 뒤에서 앞으로 읽으면 간단합니다. 즉, range(10)으로 0부터 9까지 생성하여 변수 i에 숫자를 꺼내고, 최종적으로 i를 이용하여 리스트를 만든다는 뜻입니다.

 

 

Order of operation of list comprehension 출처. 코딩도장

[i for i in range(10)]는 변수 i를 그대로 사용하지만, 다음과 같이 식 부분에서 i를 다른 값과 연산하면 각 연산의 결과를 리스트로 생성합니다.

c = [i + 5 for i in range(10)] # 0부터 9까지 숫자를 생성하면서 값에 5를 더하여 리스트 생성

print(c)
[5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
d = list(i + 5 for i in range(10))  # 0부터 9까지 숫자를 생성하면서 값에 5를 더하여 리스트 생성

print(d)
식을 [i + 5 for i in range(10)]과 같이 i에 5를 더하면 0부터 9까지의 숫자에 5를 더한 값으로 리스트를 생성합니다. 마찬가지로 [i * 2 for i in range(10)]는 0부터 9까지의 숫자에 2를 곱한 값으로 리스트를 생성합니다. 리스트 표현식은 [식 for 변수 in 리스트]처럼 [ ](대괄호)로 만들 수도 있고, list(식 for 변수 in 리스트)처럼 list로 만들 수도 있습니다. 둘 중에 성능은 대괄호 방식이 더 좋습니다. 특히 list 방식은 C 언어 스타일이라 대괄호 방식이 파이썬 다운 코드입니다. 따라서 리스트 표현식은 대괄호 방식을 사용하는 것이 좋습니다. list는 리스트 표현식을 만들 수 있다는 정도만 알아 두면 됩니다.

 

2. 리스트 표현식에서 if 조건문 사용하기

  • [식 for 변수 in 리스트 if 조건식]
  • list(식 for 변수 in 리스트 if 조건식)
# 리스트 표현식에서 if 조건문 사용하기
# 0~9 숫자 중 2의 배수인 숫자(짝수)로 리스트 생성

a = [i for i in range(10) if i % 2 == 0]

print(a)
[0, 2, 4, 6, 8]
# 0~9 숫자 중 홀수를 생성하고 그 값에 5를 곱한 값으로 리스트 생성

b = [ i * 5 for i in range(10) if i % 2 == 1]

print(b)
[5, 15, 25, 35, 45]

리스트 표현식에서 if 조건문 사용하기 출처. 코딩도장

# gu-gu-dan

c = [ i * j for j in range(2, 10) for i in range(1, 10) ]

print(c)
[2, 4, 6, 8, 10, 12, 14, 16, 18, 3, 6, 9, 12, 15, 18, 21, 24, 27, 4, 8, 12, 16, 20, 24, 28, 32, 36, 5, 10, 15, 20, 25, 30, 35, 40, 45, 6, 12, 18, 24, 30, 36, 42, 48, 54, 7, 14, 21, 28, 35, 42, 49, 56, 63, 8, 16, 24, 32, 40, 48, 56, 64, 72, 9, 18, 27, 36, 45, 54, 63, 72, 81]
d = [ i * j for i in range(2, 10)
            for j in range(1, 10)]

구구단 출처. 코딩도장

3. 리스트에 map 사용하기

map은 리스트의 요소를 지정된 함수로 처리해주는 함수입니다. map은 원본 리스트를 변경하지 않고 새 리스트를 생성합니다. map에는 리스트뿐만 아니라 모든 반복 가능한 객체를 넣을 수 있습니다. map이 반환하는 맵 객체는 이터레이터라서 변수 여러 개에 저장하는 언패킹(unpacking)이 가능합니다.(나중에 다룰 예정입니다)

 

  • list(map(함수, 리스트))
  • tuple(map(함수, 튜플))
a = [1.2, 2.5, 3.7, 4.6]

for i in range(len(a)):

    a[i] = int(a[i])

print(a)
[1, 2, 3, 4]
a = list(map(int, a))

print(a)
a = list(map(str, range(10)))

print(a)
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

리스트에 map 함수 사용 출처. 코딩도장

지금까지 input().split()으로 값을 여러 개 입력받고 정수, 실수로 변환할 때도 map을 사용했었습니다. 사실 input().split()의 결과가 문자열 리스트라서 map을 사용할 수 있었습니다.

a = input().split()

10, 20 입력

print(a)
['10', '20']
*shell환경

>>> a = map(int, input().split())
10 20 (입력)
>>> a
<map object at 0x03DFB0D0>
>>> list(a)
[10, 20]
다시 10 20을 입력하면 맵 객체(map object)가 만들어집니다. 이 상태로는 안에 들어있는 값을 볼 수 없으므로 list를 사용해서 리스트로 출력했습니다. 리스트를 보면 [10, 20]처럼 정수 두 개가 들어있습니다.

a, b = map(int, input().split())을 풀어서 쓰면 다음과 같은 코드가 됩니다.

a = map(int, input().split())
x = input().split()    # input().split()의 결과는 문자열 리스트
m = map(int, x)        # 리스트의 요소를 int로 변환, 결과는 맵 객체
a, b = m               # 맵 객체는 변수 여러 개에 저장할 수 있음

4. 튜플 사용하기

튜플은 list와 대부분 비슷합니다. 다만 주의해야 할 부분은 표현식을 사용하는 부분인데요. 예를 들면 아래와 같이 위에서 설명했던 list comprehension 처럼 원활하게 동작하지만 ( )(괄호) 안에 표현식을 넣으면 튜플이 아니라 제너레이터 표현식이 됩니다

# 튜플 표현식

a = tuple(i for i in range(10) if i % 2 == 0)
print(a)
(0, 2, 4, 6, 8)
# 제너레이터
b = (i for i in range(10) if i % 2 == 0)

print(b)
<generator object <genexpr> at 0x038AD5D8>