👨‍👩‍👦‍👦

4.4.2. 다차원 리스트와 Built-in functions, range, list comprehension

1. 다차원 리스트와 Built-in functions

리스트 안에 리스트를 만들어 여러 차원의 데이터를 만들 수 있습니다. 많이 쓰이는 형태로는 엑셀과 같이 행과 열이 있는 형태이며 이러한 table 형태의 값은 2차원으로 표현됩니다. 이 경우 자료형[행][열]로 값을 호출 할 수 있습니다.
입력
3 #상수(스칼라) [2] #1차원 리스트(Vector) [[2]] #2차원 리스트(Matrix) [[[3]]]#3차원 리스트(Tensor)
괄호의 개수로 다차원 리스트를 구별 할 수 있습니다.
 
출력
3 [2] [[2]] [[[3]]]
 
입력
#1차원 리스트 a = [100000, 2, 1, 3] print(type(a)) a = list print(type(a)) a = list('leehojun') #형변환 print(type(a)) a a[0]
a = list(list('leehojun'))은 2차원 리스트가 아닙니다.
 
출력
<class 'list'> <class 'list'> <class 'list'> ['l','e','e','h','o','j','u','n'] 'l'
 
입력
#2차원 리스트 a = [[1, 2, 3], [11, 22, 33], [10, 20, 30]] a[0] a[1] a[2] a[0][0] a[1][0] a[2][0]
 
출력
[[1, 2, 3],[11, 22, 33],[10, 20, 30]] [1, 2, 3] [11, 22, 33] [10, 20, 30] 10
 
입력
a = [[1, 2, 3], [11, 22, 33], ['leehojun', 20, 30]] a[0] a[1] a[2] a[0][0] a[1][0] a[2][0] #인덱싱 a[2][0][:3] #슬라이싱
 
출력
[[1, 2, 3],[11, 22, 33],['leehojun', 20, 30]] [1, 2, 3] [11, 22, 33] ['leehojun', 20, 30] 'leehojun' 'lee'
 
입력
#3차원 리스트 a = [[[1, 2], [1, 2], [1, 2]], [[10, 2], [1, 2], [1, 2]]] a[0] a[1] a[1][0] a[1][0][0]
 
출력
[[1, 2],[1, 2], [1, 2]] [[10, 2], [1, 2], [1, 2]] [10, 2] 10
 
입력
#3차원 리스트 a = [[[1, 2], [1, 2], [1, 2]], [['leehojun', 2], [1, 2], [1, 2]]] a[1][0][1] #인덱싱 a[1][0][1][:3] #슬라이싱
 
출력
'leehojun' 'lee'
 
입력
#기본적인 built-in functions #1차원 a = [1, 2, 3, 4, 5, 6, 7, 8] max(a) #최댓값 min(a) #최솟값 sum(a) #전체값의 합
 
출력
8 1 36
 
입력
#2차원 a = [[1, 2, 3], [11, 22, 33], [10, 2000, 30]] max(a) min(a) sum(a)
 
출력
[11, 22, 33] #대괄호 안에 있는 첫번째 값을 기준으로 출력됩니다. [1, 2, 3] ERROR
 
리스트는 순회가 가능합니다.
입력
#1차원 a = [1, 2, 3, 4, 5, 6, 7, 8] for i in a: print(i)
 
출력
1 2 3 4 5 6 7 8
 
입력
#2차원 a = [[1, 2, 3], [11, 22, 33], [13, 20000, 300000]] for i in a: print(i) #요소별로 순회하기 for i in a: for j in i: print(j)
 
출력
[1, 2, 3] [11, 22, 33] [13, 20000, 300000] [1, 2, 3] [11, 22, 33] [13, 20000, 300000] 1 2 3 11 22 33 13 20000 300000

2. range( )

range는 범위를 표연하는 용도라 많이 사용됩니다. python 2.x에서는 range자료형이 list였지만, 3.x에 와서는 range가 되었습니다. 이는 메모리를 효율적으로 다루기 위함입니다.
range(start, stop, step)start에서 stop-1까지 step의 간격으로 값을 출력하겠다는 의미입니다. 여기서 주의하셔야 할 점은 stop-1 값 까지만 출력한다는 점입니다.
입력
print(list(range(100))) print(list(range(5, 10))) #print(list(range(start, stop, step))) print(list(range(0, 101, 2))) #짝수 print(list(range(1, 101, 2))) #홀수 print(list(range(100, 1, -2)))
 
출력
[0, 1, 2, 3, 4, ... ,95, 96, 97, 98, 99] [5, 6, 7, 8, 9] [0, 2, 4, 6, 8, ... , 94, 96, 98, 100] [1, 3, 5, 7, 9, ... , 93, 95, 97, 99] [100, 98, 96, ... , 8, 6, 4, 2]
range( )는 순회 가능한 객체이며, 슬라이싱과 비슷하지만range( )는 0부터 시작합니다. 다음 값만 지칭해주기 때문에 메모리 효율이 좋습니다.

3. list comprehension(리스트 표현식, 지능형 리스트)

append를 사용하지 않고 빠르게 리스트를 만드는 방법으로 list comprehension 기법을 사용합니다. 사용법으로는 [ ]안에 for문을 넣고 필요한 구문을 이어 넣어준다음 가장 앞부분에 실제 리스트에 append 해줄 값을 넣어주면 됩니다. 아래 2개의 코드는 같은 코드라 할 수 있습니다.
 
l = [] for i in range(10): l.append(i) ll = [i for i in range(10)]
자주 이용되는 기법이니 많은 예제로 익숙해지시는 것을 권해드립니다.
 
입력
a = [i for i in range(1, 100) if i %3 == 0 or i %5 == 0] a
 
출력
[3, 5, 6, 9, 10, . . . 중략]
 
아래 코드는 구구단을 출력하는 코드입니다. 풀어서 썼을 때와 비교해보시기 바랍니다.
입력
a = [f'{i} X {j} = {i*j}' for i in range(2, 10) for j in range(1, 10)] a
 
입력
a = [] for i in range(2, 10): for j in range(1, 10): a.append(f'{i} X {j} = {i*j}')