SWE_python_List2(2차원리스트)

Python_List1(2)

목차

  1. 2차원 리스트
  2. 부분집합
  3. 검색
  4. 정렬

1. 2차원 리스트

  • 1차원 리스트를 묶어놓은 List
  • arr = [[0,1,2,3],[4,5,6,7]]
  • 파이썬에서는 데이터 초기화를 통해 변수선언과 초기화가 가능하다

1.1 List 초기화 방법

#1 원소 나열
arr = [0,0,0,0,0]
#2 곱셈 연산 사용
arr = [0]*5 #[0,0,0,0,0]
#3 리스트 함축 이용
arr = [i for i in range(2,9) if i%2==0] # [2,4,6,8]

# 2차원 리스트의 경우
brr = [[1,2,3],[1,2,3,],[1,2,3]]
brr = [[1,2,3]*3]
brr = [1,2,3] for i in range(3)]
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.2 2차원 List 입력 받기

>첫째 줄에 n행 m열
>둘째 줄에 n*m의 행열 데이터가 주어질 경우 입력을 받는 방법
3 4
0 1 0 0
0 0 0 0
0 0 1 0
>행크기 만큼의 1차원 리스트를 만들어놓고, 각 행에 리스트를 저장하면 2차원 리스트 제작 가능
  1. list 함축과, 반복문 이용
n, m = map(int, input().split()) # n,m을 입력 받는다

mylist = [0 for _ in range(n)] # mylist를 0을 n개 넣은 1차원 리스트로 초기화
#mylist = [0]*n

for i in range(n):
    mylist[i] = list(map(int, input().split())) # 이후 반복문을 돌면서, 각 인자에 리스트 추가
  1. append method를 이용하여 2차원 리스트 만들기
n,m = map(int,input().split())
mylist=[]
for i in range(n):
    mylist.append(list(map(int,input().split())))
  1. 1번에 리스트 함축을 이용
n, m = map(int, input().split())
mylist = [list(map(int, input().split())) for _ in range(n)]

1.3 2차원 리스트에서 원하는 데이터의 위치 찾기

> 주어진 데이터에서 1이 입력된 [행, 열]의 위치 찾기
  1. 단순한 예제
n,m = map(int,input().split())
newlist = []
mylist = [0 for _ in range(n)]
for i in range(n):
    mylist[i] = list(map(int,input().split()))
    for j in range(m):
        if mylist[i][j] == 1:
            newlist.append([i,j])
  1. 예제
n,m = map(int,input().split())
mylist = [list(map(int,input().split()))for_ in range(n)]
newlist = [(i,j)for i in range(n) for j in range(m) if mylist[i][j] == 1]

1.4 리스트 순회

리스트 순회 : n X m List의 n*m개의 모든 원소를 빠짐없이 조사하는 방법

  1. 행 우선 순회 List의 행을 우선으로 List의 원소를 조사하는 방법
arr = [[0,1,2,3],[4,5,6,7],[8,9,10,11]]
# i : 행의 좌표, n = len(arr)
# j : 열의 좌표, m = len(arr[0])

for i in range(len(arr)):
    for j in range(len(arr[i])):
        arr[i[j]] # 필요한 연산 수행
  1. 열 우선 순회 행 우선 순회에서 행과 열의 위치를 바꾸어서 구현할 수 있다.
# i : 행의 좌표, n = len(arr)
# j : 열의 좌표, m = len(arr[0])

for j in range(len(arr[0])):
    for i in range(len(arr)):
        arr[i][j] # 필요한 연산 수행
  1. 지그재그 순회 List의 행을 좌우로 조사하는 방법
# i : 행의 좌표, n = len(arr)
# j : 열의 좌표, m = len(arr[0])

for i in range(len(arr)):
    for j in range(len(arr[0])):
        arr[i][j+(m-1-2*j)*(i%2)]
        #필요한 연산 수행

1.5. 델타를 이용한 2차 리스트 탐색

  1. 2차 List의 한 좌표에서 네 방향의 인접 List 요소를 탐색할 때 사용하는 방법
  2. 델타 값은 한 좌표에서 네 방향의 좌표와 x,y의 차이를 저장한 List로 구현
  3. 델타 값을 이용하여 특정 원소의 상하좌우에 위치한 원소에 접근할 수 있음
  • 이차원 List의 가장 자리원소들은 상하좌우 네 방향에 원소가 존재하지 않을 경우가 있으므로, index를 체크하거나 index의 범위를 제한해야 함
# arr [0 ... n-1][0 ... n-1] : 2차원 List
dx = [0,0,-1,1] # 상하좌우
dy = [-1,1,0,0]

for x in range(len(arr)):
    for y in range(len(arr[x])):
        for i in ragne(4):
            textX = x+dx[i]
            testY = y+dy[i]
            print(arr[testX][testY])

1.6 전치 행렬

전치 행렬 : 행과 열의 값이 반대인 행렬

    1 2 3           1 4 7
    4 5 6    =>     2 5 8
    7 8 9           3 6 9
# i : 행의 좌표,len(arr)
# j : 열의 좌표, len(arr[0])
arr = [[1,2,3],[4,5,6,],[7,8,9]] # 3*3 행렬

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]

+tip : 모든 좌표에 대하여 행과 열의 값을 바꾸게 되면 본래의 모습으로 되돌아오기 때문에 이를 주의해야 함

1.7 zip(iterable *) 함수

동일한 개수로 이루어진 자료형들을 묶어 주는 역할을 하는 함수

alpha = ['a','b','c']
index = [1,2,3]
이를 zip(alpah,index) 함수에 넣으면  리스트를 슬라이스 하여 순서대로 튜플 객체로 묶어준다
묶은 결과는 리스트나 딕셔너리 객체로 만들어서 사용할  있다.
('a',1),('b',2),('c',3)

만약 개수가 동일하지 않은 자료형들을 zip 함수로 묶으면 자료형의 크기가 작은 쪽의 원소까지만 묶어준다
alpha = ['a','b','c']
index = [1,2,3]
alph_index = list(zip(alpha,index))
print(alph_index)
>>> [('a',1),('b',2),('c',3)]
# zip 함수의 인자로 리스트를 행별로 쪼개서 사용할 수 있다.
arr = [[1,2,3],[4,5,6],[7,8,9]]
print(list(zip(*arr)))
>>>[(1,4,7),(2,5,8),(3,6,9)]
# tip  -> zip(*matrix):전치행렬

참고자료 [SWE]https://swexpertacademy.com

0%