[Python] 리스트(List) vs 배열(Array)

애이용·2021년 1월 29일
4

python

목록 보기
2/7
post-thumbnail

알고리즘 문제 풀 때 헷갈리는 문법 정리(2) - 리스트


Arrays와 Lists의 공통점

  • 아이템들의 컬렉션
  • 아이템들의 순서 존재

Arrays와 Lists의 차이점

Arrays

  • 배열은 인덱스가 존재
  • 데이터의 위치에 대해 직접적인 접근 가능
  • 반드시 할당된 공간은 연속적 => 조회가 빠름, cache hit 가능성 ↑
  • 미리 배열의 크기를 지정해야하고, 고정되어있는 배열의 크기때문에 데이터의 추가 및 삭제가 불편

Lists

  • 인덱스를 갖지만, 몇번째 데이터인지 정도를 의미
  • 메모리 주소가 연속적이 아닐 수도 있음
  • 포인터를 통해 다음 데이터의 위치를 가리키고 있어 삽입, 삭제가 쉬움
  • 동적이므로, 배열과 다르게 크기가 정해져 있지 X
  • 검색 성능이 좋지 않음, 직접적인 접근이 불가능하고, 처음부터 찾아야한다 => 확실하게 정해져 있는 데이터는 배열이 효율적

파이썬에서는 리스트라는 용어를 컴퓨터 공학에서의 리스트와 다르게 사용한다
파이썬의 리스트는 배열처럼 구현되어있다.
파이썬 리스트의 아이템들은 메모리 상의 연속적인 위치에 배치되어, 인덱스를 사용하여 접근이 가능

N차원 리스트 선언 🤦‍

문제를 풀면서 가장 헷갈렸던 부분을 코드를 작성하면서 연습했다.
문제를 풀다가 원치 않았던 값이 수정되어 있어서 놀랐던 적이 ,,,

다차원 리스트

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)]
이렇게 선언하도록 하자 ❗ ❗

1차원 리스트

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차원 리스트는 예상했던 대로 원하는 값만 수정할 수 있다.
각 열이 같은 객체로 인식 되니까 !!

append도 적용해보자

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

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 등 타입 비교 정리해야겠다 👍

profile
로그를 남기자 〰️

0개의 댓글