반응형

Python을 하다보면, 2d-array가 필요한 경우가 종종 생긴다. 바로 직전에 올렸던 scipy linprog 이용할 때도 2d array가 필요했던 것처럼 말이다. 물론, 개수가 얼마 안된다면, 코드를 생각하면서 만드는 것보다는 하나씩 입력하는 게 빠를 테지만, 사람의 손으로 할 수 없는 범위까지 가게 된다면 코드를 작성하는 것이 훨씬 편리하다. 코드를 결론부터 얘기하자면, 아래와 같다.

value = [1,2,3,4,5]		#입력 값
data_list = []

for line in range(3):
    data_list.append([])		# A
    for item in value:			
        data_list[-1].append(item)	# B
        
print(data_list)

value를 입력받아서, data_list에 2d_array로 만드는 과정이다. 사실 여기서는 입력값이 value로 한정되어 있어서, [1,2,3,4,5]만 반복되는 형태이지만, 만일 조금더 동적으로 다양한 데이터가 있다면 조금 응용해서 동적으로 입력하는 코드도 작성이 가능하다.

 

각 라인별로 해석은 아래와 같다.

 

A: data_list에 []를 range(3), 즉 3번 반복해서 추가해준다.  여기서 명심해야 할 것은 value가 리스트형이므로, 2d-array를 형성하기 위해서는 append를 사용해야 한다는 점이다.

 

더보기

cf) append와 extend의 차이

리스트를 입력받았을 때, append는 list 자체를 하나의 원소로 추가를 해주는 반면, extend는 리스트 안에 있는 값들을 원소로 확장시켜준다.

 

B: value안에 있는 값들을 하나씩(item) 넣어주게 되는데, A에서 첫번째 data_list의 형태는  [ [] ]에 안쪽 리스트에 item을 넣어준다. 두번째는 [ [1,2,3,4,5], [] ]가 될 것이고 거기 index = -1에 item을 넣어주므로 [ [1,2,3,4,5], [1,2,3,4,5]]가 될 것이다. 마지막 세번째도 똑같이 적용하면 아래와 같은 결과 값을 얻게 된다.

 

Out : [[1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5]]

 

만일에 index -1을 설정안해준 코드를 적용해보면 어떨까? 그런 경우를 상정해서 아래와 같이 변경했다.

value = [1,2,3,4,5]	
data_list = []

for line in range(3):
    data_list.append([])		
    for item in value:			
        data_list.append(item)	# 여기만 [-1] 빼서 수정
        
print(data_list)

이럴 경우, 첫번째 만들어진  [ [] ] 에 item들을 넣어주는 것이기 때문에 1번 루프를 돌고나면, [ [], 1,2,3,4,5]가 만들어진다. 똑같은 논리로 이후 루프도 돌기 때문에 아래와 같은 결과가 나오게 되므로 주의해야 한다.

 

Out : [[], 1, 2, 3, 4, 5, [], 1, 2, 3, 4, 5, [], 1, 2, 3, 4, 5]

반응형