*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를 이용하여 리스트를 만든다는 뜻입니다. |
[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] |
# 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'] |
지금까지 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> |
'Programming > Python' 카테고리의 다른 글
[코딩도장-파이썬] 2차원 리스트 사용하기 2 (출력과 입력) (0) | 2020.11.20 |
---|---|
[코딩도장-파이썬] 2차원 리스트 사용하기 1 (0) | 2020.11.20 |
[코딩도장-파이썬] 리스트(List)와 튜플(Tuple) 응용하기 2 (0) | 2020.11.19 |
[코딩도장-파이썬] 리스트(List)와 튜플(Tuple) 응용하기 1 (0) | 2020.11.18 |
[코딩도장-파이썬] 터틀 그래픽스 (0) | 2020.11.17 |