Python_List1(2)
목차
- 2차원 리스트
- 부분집합
- 검색
- 정렬
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차원 리스트 제작 가능
- 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())) # 이후 반복문을 돌면서, 각 인자에 리스트 추가
- append method를 이용하여 2차원 리스트 만들기
n,m = map(int,input().split())
mylist=[]
for i in range(n):
mylist.append(list(map(int,input().split())))
- 1번에 리스트 함축을 이용
n, m = map(int, input().split())
mylist = [list(map(int, input().split())) for _ in range(n)]
1.3 2차원 리스트에서 원하는 데이터의 위치 찾기
> 주어진 데이터에서 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])
- 예제
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개의 모든 원소를 빠짐없이 조사하는 방법
- 행 우선 순회 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]] # 필요한 연산 수행
- 열 우선 순회 행 우선 순회에서 행과 열의 위치를 바꾸어서 구현할 수 있다.
# 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] # 필요한 연산 수행
- 지그재그 순회 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차 리스트 탐색
- 2차 List의 한 좌표에서 네 방향의 인접 List 요소를 탐색할 때 사용하는 방법
- 델타 값은 한 좌표에서 네 방향의 좌표와 x,y의 차이를 저장한 List로 구현
- 델타 값을 이용하여 특정 원소의 상하좌우에 위치한 원소에 접근할 수 있음
- 이차원 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