파이썬에서는 리스트라는 용어를 컴퓨터 공학에서의 리스트와 다르게 사용한다
파이썬의 리스트는 배열처럼 구현되어있다.
파이썬 리스트의 아이템들은 메모리 상의 연속적인 위치에 배치되어, 인덱스를 사용하여 접근이 가능
문제를 풀면서 가장 헷갈렸던 부분을 코드를 작성하면서 연습했다.
문제를 풀다가 원치 않았던 값이 수정되어 있어서 놀랐던 적이 ,,,
n = 5
arr1 = [[0 for j in range(n)] for i in range(n)]
arr2 = [[0] * n] * n
arr3 = [[0] * n for i in range(n)]
print(arr1)
print(arr2)
print(arr3)
'''
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
'''
arr1[1][2] = 3
arr2[1][2] = 3
arr3[1][2] = 3
print(arr1)
print(arr2)
print(arr3)
'''
[[0, 0, 0, 0, 0], [0, 0, 3, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
[[0, 0, 3, 0, 0], [0, 0, 3, 0, 0], [0, 0, 3, 0, 0], [0, 0, 3, 0, 0], [0, 0, 3, 0, 0]]
[[0, 0, 0, 0, 0], [0, 0, 3, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
'''
arr2를 확인하자
arr2[1][2] = 3 을 명령하였지만 결과는
[[0, 0, 3, 0, 0], [0, 0, 3, 0, 0], [0, 0, 3, 0, 0], [0, 0, 3, 0, 0], [0, 0, 3, 0, 0]]
모든 행의 3번째 값이 3으로 수정된 것을 확인할 수 있다.
[[0] * n] * n
으로 리스트를 초기화할 경우, n개의 [0] * n은 모두 같은 객체로 인식이 된다.
그렇기 때문에 꼭 다차원 리스트를 선언할 때는,
[[0 for j in range(n)] for i in range(n)]
[[0] * n for i in range(n)]
이렇게 선언하도록 하자 ❗ ❗
arr1 = [0 for i in range(n)]
arr2 = [0] * n
print(arr1)
print(arr2)
'''
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
'''
arr1[2] = 3
arr2[2] = 3
print(arr1)
print(arr2)
'''
[0, 0, 3, 0, 0]
[0, 0, 3, 0, 0]
'''
1차원 리스트는 예상했던 대로 원하는 값만 수정할 수 있다.
각 열이 같은 객체로 인식 되니까 !!
arr1 = [[] for i in range(n)]
arr2 = [[]] * n
print(arr1)
print(arr2)
'''
[[], [], [], [], []]
[[], [], [], [], []]
'''
arr1[2].append(3)
arr2[2].append(3)
print(arr1)
print(arr2)
'''
[[], [], [3], [], []]
[[3], [3], [3], [3], [3]]
'''
[[]] * n
로 선언한 경우, []는 모두 같은 객체로 인식됨. (이 문장을 기억하자)
그렇기 때문에 모든 배열에 3이 추가된 것을 확인 할 수 있다.
pop
도 마찬가지
정리하다보니 이제 정확히 리스트를 선언할 수 있을 것 같다 😎
리스트 정리니 예외로 하나 더 정리해보자
프로그래머스 문자열 압축 문제를 풀면서 알게 된 내용!
s : 문자열, length : 문자열 길이, i : 자를 길이 단위
arr = [s[j:j+i] for j in range(0, length, i)]
arr = list(map(''.join, zip(*[iter(s)] * i)))
문자열을 일정 길이로 잘라 배열로 만들 수 있다!
여기서 zip 내장함수를 알고 가자
zip()
은 동일한 개수로 이루어진 자료형을 묶어 주는 역할을 하는 함수이다
예시를 보자
num = [1, 2, 3, 4]
name = ['ayong', 'marie', 'maum', 'maong']
list1 = list(zip(num, name)) # 아이템이 튜플타입인 리스트
dict1 = dict(list1) # 리스트를 딕셔너리 형태로
print(list1)
print(dict1)
'''
[(1, 'ayong'), (2, 'marie'), (3, 'maum'), (4, 'maong')]
{1: 'ayong', 2: 'marie', 3: 'maum', 4: 'maong'}
'''
for n, m in zip(num, name):
print(n, m)
'''
1 ayong
2 marie
3 maum
4 maong
'''
### 여기는 그냥 테스트
print(set(list1))
print(set(dict1))
'''
{(1, 'ayong'), (3, 'maum'), (4, 'maong'), (2, 'marie')}
{1, 2, 3, 4}
'''
zip
을 이용해서 깔꼼하게 풀리는 문제
프로그래머스 기능 개발
연습해야지!
이렇게 편한 함수가 있었다니 신기할 따름
나중엔 set, dictionary, tuple, list 등 타입 비교 정리해야겠다 👍