Python for Coding Test (2) 리스트(List)

Jihoon Oh·2020년 12월 28일
0

Python for Coding Test

목록 보기
3/4
post-thumbnail

리스트(List)는 파이썬의 자료 구조 중 하나로, 값을 나열 해 놓은 배열이라고 생각하면 된다. list는 string, tuple과 함께 순서가 있는 자료형이다.
파이썬의 list는 다른 언어의 list와 조금 다르다. 파이썬과 함께 코딩 테스트에 많이 쓰이는 C++에 비교를 해 보자면, C++의 STL에서 제공하는 vector 자료형과 비슷하다고 볼 수 있다.
append()와 remove() 메소드를 제공하는 linked list를 사용한다.

list의 요소

대괄호([])로 요소들을 감싸 리스트로 만들 수 있다.

a = [] # 원소가 들어있지 않은 리스트도 리스트
b = [0, 1, 2, 3] # 숫자 자료형 저장
c = ['Hello', 'World!'] # 문자열도 저장할 수 있다.
d = [0, 'zero'] # 여러 자료형을 함께 저장할 수 있다.
e = [0, [1,2], [3,4,5]] # 리스트 안에 또 다른 리스트를 넣을 수 있다.

인덱싱과 슬라이싱

리스트도 문자열과 마찬가지로 인덱싱을 할 수 있다.

  • 사용 방법은 문자열 인덱싱과 동일하다.
  • 리스트 안에 리스트가 있을 경우, C++의 2차원 배열처럼 인덱싱이 가능하다.
a = ['zero', 'one', 'two', 'three', ['four', 'five']]
print(a[0])
	>> zero
print(a[3])
	>> three
print(a[-1])
	>> ['four','five']
print(a[4][1]) # 이중 리스트 인덱싱
	>> five

또한 해당 인덱스를 가지고 슬라이싱을 할 수도 있다.

  • 사용 방법은 문자열의 슬라이싱과 동일하다.
  • 리스트 안의 리스트에도 인덱싱이 가능하다.
a = ['zero', 'one', 'two', 'three', ['four', 'five']]
print(a[:2])
	>> ['zero', 'one']
print(a[2:])
	>> ['two', 'three', ['four', 'five']]
print(a[1:3])
	>> ['one', 'two']
print(a[4][:1]) # 이중 리스트의 슬라이싱
	>> ['four']

list 연산

리스트도 문자열처럼 +와 * 연산이 가능하다.

a = [1, 2, 3]
b = [4, 5, 6]
print(a+b)
	>> [1, 2, 3, 4, 5, 6]
print(a*3)
	>> [1, 2, 3, 1, 2, 3, 1, 2, 3]

리스트의 길이는 len 함수를 사용해서 구할 수 있다.

a = [1, 2, 3, 4, 5]
print(len(a))
	>> 5

리스트의 요소들을 for 문으로 접근하려면 다음과 같은 방법을 사용할 수 있다.

a = [1, 2, 3, 4, 5]
for i in a: # element 들에 접근
	print(i, end=" ")
	>> 1 2 3 4 5 
for idx in range(len(a)): # 인덱스로 접근
	print(a[idx], end=" ")
    >> 1 2 3 4 5
    
# enumerate를 사용하면 매 반복마다 리스트의 인덱스와 값을 튜플로 반환한다.
for idx, value in enumerate(a):
	print(idx, value)
    	>> (0, 1)
	   (1, 2)
	   (2, 3)
	   (3, 4)
	   (4, 5)

list 수정, 삭제

리스트 값 수정하기

  • 리스트의 인덱스로 접근하여 값을 수정할 수 있다.
a = [1, 2, 3, 4, 5]
a[1] = 10
print(a)
	>> [1, 10, 3, 4, 5]

리스트 요소 삭제하기

  • del 함수를 통해 삭제할 수 있다.
  • del 함수는 객체를 삭제하므로 슬라이싱을 사용해서 여러개의 원소를 삭제할 수 있다.
a = [1, 2, 3, 4, 5]
del a[1]
print(a)
	>> [1, 3, 4, 5]
del a[2:] # 슬라이싱을 통한 삭제도 가능하다.
	>> [1, 3]

list 관련 함수

append 함수

  • append(x): 리스트의 맨 끝에 x를 추가한다.
  • C++ vector의 push_back 함수와 동일하다.
a = [1, 2, 3, 4, 5]
a.append(6)
print(a)
	>> [1, 2, 3, 4, 5, 6]

# 문자열을 비롯한 어떤 자료형도 추가할 수 있다.
a.append('seven') 
print(a)
	>> [1, 2, 3, 4, 5, 6, 'seven']
a. append([8, 9])
print(a)
	>> [1, 2, 3, 4, 5, 6, 'seven', [8, 9])

insert 함수

  • insert(idx,value): 리스트의 idx 위치에 value를 추가한다.
  • 주의: 리스트의 인덱스는 0부터 시작이다.
  • 주의: insert의 시간복잡도는 O(N) 이므로 append를 사용할 수 있는 상황에서는 append를 사용하는 것이 더 좋다.
a = [1, 3, 4, 5]
a.insert(1,2)
print(a)
	>> [1, 2, 3, 4, 5]

remove 함수

  • remove(x): 리스트에서 첫 번째로 나오는 x를 삭제한다.
  • 주의: remove 역시 시간복잡도가 O(N) 이므로, 어떤 값이 중복되는 경우 삭제하고 싶으면 set을 활용하는 것이 더 낫다.
a = [1, 2, 2, 3]
a.remove(2)
print(a)
	>> [1, 2, 3]

pop 함수

  • pop(): 리스트의 맨 뒤에 있는 요소를 리스트에서 삭제하고 반환한다.
  • pop(idx): 리스트의 idx 위치에 있는 요소를 삭제하고 반환한다.
a = [1, 2, 3, 4]
b = a,pop()
print(a)
	>> [1, 2, 3]
print(b)
	>> 4
    
b = a.pop(0)
print(a)
	>> [2, 3]
print(b)
	>> 1

sort 함수와 reverse 함수

  • sort(): 리스트의 요소를 순서대로 정렬해준다.
  • sort(reverse=True)를 통해서 내림차순으로 정렬할 수 있다.
  • reverse(): 리스트의 순서를 현재 상태에서 거꾸로 뒤집어준다.
a = b = [2, 3, 5, 1, 4]
a.sort()
print(a)
	>> [1, 2, 3, 4, 5]

b.reverse()
print(b) >> [4, 1, 5, 3, 2]

index 함수

  • index(x): x가 처음으로 나오는 위치를 반환한다.
a = [1, 2, 2, 3, 4]
print(a.index(2))
	>> 1
print(a.index(3))
	>> 3
print(a.index(5))
	>> Traceback (most recent call last):
	>> File "<stdin>", line 1, in <module>
	>> ValueError: 5 is not in list

count 함수

  • count(x): x가 배열에 몇개 있는지 반환한다.
a = [1, 2, 3, 3, 3]
print(a.count(2))
	>> 1
print(a.count(3))
	>> 3

extend 함수

  • extend(x): 리스트 x를 합친다.
  • x의 위치에는 리스트 자료형만 올 수 있다.
a = [1, 2, 3]
a.extend([4, 5])
print(a)
	>> [1, 2, 3, 4, 5]
    
b = [6, 7]
a.extend(b)
print(a)
	>> [1, 2, 3, 4, 5, 6, 7]

list 안에서 for 문 사용

코드의 간결함을 지향하는 파이썬 답게 리스트 안에서 for 문 사용이 가능하다.
(처음엔 이걸 몰라서 for 문 안에서 list를 if로 정리하고 있었다.)
for 문과 함께 if 문도 함께 사용 가능하다.

a = [1, 2, 3, 4, 5, 6]
print([item for item in a if item % 2 == 0])
	>> [2, 4, 6]

아직 쉬운 단계의 문제들 밖에 풀어보지 않았지만, 리스트 자료형은 정말 많이 쓰이는 것 같다. 특히나 리스트 슬라이싱을 이용해서 풀이의 코드 길이를 확 줄일 수 있는 경우가 많았다.
또한 다른 언어의 배열과는 다르게 vector의 성격을 갖고 있다는 점이 굉장한 장점이라고 생각한다. append와 remove가 제공되기 때문에 배열의 크기와 인덱스를 매 번 고려하지 않아도 된다는 점이 만족스럽다.

참고 자료
WikiDocs 점프 투 파이썬 - 02-3 리스트 자료형

profile
Backend Developeer

0개의 댓글