안녕하세요 : ) 오늘은 2차원 List를 알아봅시다
1. 2차원 List의 구조
2차원 List는 1차원 List를 묶어놓은 리스트다.
2차원 이상의 다차원 List는 차원에 따라 Index를 선언한다.
2차원 List의 선언은 행의 개수(세로 길이), 열의 개수(가로 길이)를 필요로 한다.
ex) array=[[1,2,3,4],[5,6,7,8]]
2. List 초기화
ex)
arr=[0,0,0,0]
arr=[0]*4 #'*'연산자를 이용하여 첫줄과 같은 결과를 얻음.
arr=[i for i in range(2,9) if i%2==0] #결과는 [2,4,6,8]
위의 코드는 1차원 리스트를 초기화하는 예다.
세번째줄은 반복문을 이용하여 2에서 8까지 짝수인 수만 리스트로 초기화한다.
range(x,y)에서 y는 범위에 포함되지 않는것에 주의한다.
brr=[[11,22,33],[11,22,33]]
brr=[[11,22,33]]*2
brr=[[11,22,33] for i in range(2)] #1,2와 동일한 결과가 얻어짐.
brr=[[i,j]for i in range(3) for j in range(2)] #[[0,0],[0,1],[1,0],[1,1],[2,0],[2,1]]
# 1부터 n까지 초기화된 2차원 리스트 방법 1
rows, columns=6,6
table=[]
for r in range(rows) :
table.append([a for a in range(r*columns+1, (r+1)*columns+1)])
# 1부터 n까지 초기화된 2차원 리스트 방법 2
matrix=[[row*columns+col+1 for col in range(columns)] for row in range(rows)]
2차원 리스트를 초기화하는 예다.
네번째줄은 반복문을 2개를 사용하여 i는 0에서 2까지 j는 0에서 1까지의 범위로 리스트를 초기화했다.
3. 2차원 List 입력받기
n,m=map(int, input().split())
nlist=[list(map(int, input().split())) for i in range(n)]
map(int, input().split())는 입력받은 데이터를 개별로 나누고 int형으로 처리한다.
nlist를 만들 때 list()를 쓰지 않으면 list가 생성되지 않고 에러가 뜬다.
map은 map 객체를 반환한다.
3. 2차원 List에서 원하는 데이터의 위치 찾기
n, m=map(int, input().split())
mylist=[list(map(int, input().split())) for i in range(n)]
xlist=[(i,j) for i in range(n) for j in range(m) if mylist[i][j] == 1]
반복문을 2개 사용해서 2차원 리스트의 각 요소를 검사하고 있다.
i와 j를 tuple로 받고 xlist에 할당할 때는 list로 변환되어 출력한다.
4. 2차원 리스트의 순회
4-1. 행 우선 순회
list의 행을 우선으로 원소를 조사한다.
# i는 행, j는 열
arr=[[1,2,3,4], [5,6,7,8], [9,10,11,12]]
n=len(arr)
m=len(arr[0])
for i in range(n):
for j in range(m):
print(arr[i][j], end=' ')
print()
n=len(arr)은 3이다. [1,2,3,4], [5,6,7,8], [9,10,11,12]
m=len(arr[0])은 arr[0]이 [1,2,3,4]이므로 4이다.
4-2. 열 우선 순회
# i는 행의 좌표, j는 열의 좌표
mylist=[[1,2],[3,4],[5,6]]
n=len(mylist)
m=len(mylist[0])
for j in range(m):
for i in range(n):
print(mylist[i][j], end=' ')
위에 행 우선 순회와 반복문에서 조금 다르다.
바깥쪽 for문을 보면 리스트의 열길이 만큼 지정된다.
4-3. 지그재그 순회
list의 행을 좌우로 조사하는 것이다.
→
←
→이런 느낌으로
mylist=[[1,2,3],[4,5,6],[7,8,9],[10,11,12]]
count=0
for i in range(len(mylist)):
for j in range(len(mylist[0])):
if i%2==1:
j=len(mylist[0])-1-count
count+=1
print(mylist[i][j], end=' ')
print()
행이 홀수라면(i%2==1) j가 열의 마지막 인덱스가 되도록 한다.
리스트는 0부터 시작하므로 len(mylist[0])-1을 해줘야 한다.
count변수를 이용해서 뒤에서 앞으로 이동한다.
4-4. 델타를 이용한 2차원 List 탐색
2차원 List의 어느 한 좌표에서 상하좌우로 인접한 요소를 탐색할 때 사용.
델타 값은 한 좌표에서 네 방향의 좌표와 x, y의 차이를 저장한 List로 구현한다.
델타 값으로 특정 원소의 상하좌우에 있는 원소에 접근할 수 있다.
가장자리에 있는 원소들은 네방향에 원소가 존재하지 않을 경우가 있기 때문에 index를 체크하거나 index의 범위를 제한해야함.
arr=[[1,2,3,3],[3,7,5,3],[3,5,4,1],[1,5,4,6]]
dx=[0, 0, -1, 1] # 상 하 좌 우
dy=[-1, 1, 0, 0]
for x in range(1, len(arr)-1):
for y in range(1,len(arr[x])-1):
print(arr[x][y])
newlist=[]
for i in range(4):
testx=x+dx[i]
testy=y+dy[i]
newlist.append(arr[testx][testy])
print("상하좌우",newlist)
print()
상하좌우 네방향을 가지는 원소만 탐색한다.
가장자리 부분에 있는 원소의 인덱스는 0으로 시작하거나 마지막이다.
따라서 for문을 구현할 때 1부터 배열길이-1만큼 반복하도록 하였다.
4-5. 전치행렬
행과 열의 값이 반대인 행렬이다.
가운데를 중심으로 양 옆의 값들이 서로 바뀐걸 볼 수 있다.
arr=[[1,2,3],[4,5,6],[7,8,9]]
for i in range(3):
for j in range(3):
if i<j:
arr[i][j],arr[j][i]=arr[j][i],arr[i][j]
print(arr)
i=j인 인덱스의 값은 중심이므로 바뀌지 않는다.
i>j로 바꿔 실행해도 결과는 같다.
zip()를 이용하면 더 쉽게 전치행렬을 만들 수 있다.
arr=[[1,2,3],[4,5,6],[7,8,9]]
print(list(zip(*arr))) # [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
zip은 zip object를 반환하므로 list를 사용해야 리스트형태로 출력된 결과를 얻을 수 있다.
그리고 zip()은 동일한 개수로 이루어진 자료형들을 묶어주는 역할을 함수이다.
letter=['x','y','z']
number=[0,1,2]
using_zip=list(zip(letter, number))
print(using_zip)
실행결과는 [('x',0), ('y', 1), ('z', 2)]이다.
'Computer science > Algorithm' 카테고리의 다른 글
검색 (0) | 2020.02.27 |
---|---|
부분집합 (0) | 2020.02.22 |
정렬 (0) | 2020.01.31 |
Greedy Algorithm(탐욕 알고리즘) (0) | 2020.01.28 |
Exhausitive Search(완전 검색) (0) | 2020.01.28 |