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]
'Python > CS' 카테고리의 다른 글
[알고리즘] 파이썬으로 병합정렬/합병정렬 (Merge Sort) 구현하기 (0) | 2021.10.10 |
---|---|
[알고리즘] 파이썬으로 퀵정렬(Quick Sort) 구현하기 (0) | 2021.09.19 |
[알고리즘] 파이썬으로 삽입 정렬(Insertion Sort) 구현하기 (0) | 2021.09.04 |
[알고리즘] 파이썬으로 버블 정렬 (Bubble Sort) 구현하기 (0) | 2021.09.02 |
[알고리즘] 파이썬으로 선택정렬 (Selection Sort) 구현하기 (0) | 2021.08.29 |