Algorithm

[ Python ] 정렬 (1) - list 개념

jogaknabi_1023 2024. 4. 4. 23:41

Python에서는 기본 데이터 타입인 숫자형 타입, 불리언 타입, 문자열 타입과는 별도로 이들로 구성되는 다양한 컨테이너 형태의 데이터 구조를 제공한다. 그 중에서도 가장 많이 사용되는 것이 바로 리스트(list) 타입이다.
이와 같은 데이터 타입을 다른 프로그래밍 언어에서는 배열(array)이라고도 부르지만, 파이썬에서는 리스트(list)라는 용어만을 사용한다.
 
Python list 특징
1) 리스트에 저장되는 요소가 모두 같은 타입일 필요는 없다.

2) 리스트에는 요소들이 순서대로 저장되며, 각 요소는 0부터 시작하는 인덱스(index)를 사용하여 접근할 수 있다.
3) 리스트는 그 값을 변경할 수 있다. (mutable type)
 
 

  • 리스트 선언하기

리스트는 대괄호 []로 감싸서 선언할 수 있으며, 리스트 안의 요소(element)들은 쉼표(,)로 구분한다.

list = [2, 3, 5, 7]  

for p in list:
    print(p)
    
# 결과
2
3
5
7

 
 

  • 리스트 요소 선택하기

for 문을 사용하면 리스트의 모든 요소에 순차적으로 접근할 수 있다. 하지만 리스트의 특정 요소에만 접근하고 싶을 때에는 0부터 시작하는 인덱스(index)를 사용해야만 한다.
문자열과 마찬가지로 음의 인덱스를 지원하며, 음의 인덱스는 리스트의 마지막 요소를 -1로 놓고 역순으로 증가한다.

list = [2, 3, 5, 7]  

print(list[0])
print(list[-1])
    
# 결과
2
7

 
 

  • 리스트 자르기

리스트를 다루다보면 리스트의 일부분만을 선택하거나 리스트의 일부 요소들만을 수정해야한다. 이러한 경우 손쉽게 처리할 수 있도록 문자열과 마찬가지로 리스트에서도 슬라이싱(slicing)을 지원하고 있다.
원본 리스트에는 전혀 영향을 미치지 않으며, 해당 부분에 해당하는 새로운 리스트를 생성하여 반환해 주는 것이다.

list1 = [1, 2, 3, 4, 5]  

print(list1[3])
# 결과 : 4
# 단일 요소를 선택하여 출력

print(list1[1:3])
# 결과 : [2, 3]
# 슬라이싱하여 새로운 리스트

print(list1[:3])
# 결과 : [1, 2, 3]

print(list1[3:])
# 결과 : [4, 5]

print(list1)
# 결과 : [1, 2, 3, 4, 5]

 
 

  • 리스트 복사하기

대입 연산자(=)를 사용하여 리스트를 그대로 변수에 대입함으로써 리스트를 복사하고자 한다. 그리고나서 4번 라인에서 복사된 리스트에 6을 추가한다.

list1 = [1, 2, 3, 4, 5]  

copy = list1
copy.append(6)  

print(copy)
# 결과 : [1, 2, 3, 4, 5, 6]

print(list1)
# 결과 : [1, 2, 3, 4, 5, 6]

하지만 실행 결과를 보면 추가한 6이라는 요소가 복사된 리스트뿐만 아니라 원본 리스트에도 추가되었음을 확인할 수 있다. 이처럼 단순히 리스트명을 변수에 대입하는 것은 리스트를 복사하는 것이 아니라 원본 리스트의 메모리 주소만을 넘겨주는 것이다. 즉, 3번 라인에 의해 리스트명 list1과 변수명 copy는 같은 리스트를 가리키게 된 것이다.
 
따라서 리스트의 복사본을 제대로 만들고 싶다면 다음과 같이 리스트 슬라이싱을 이용하여 리스트를 복사해야 한다.

list1 = [1, 2, 3, 4, 5]  

copy = list1[:]
copy.append(6)  

print(copy)
# 결과 : [1, 2, 3, 4, 5, 6]

print(list1)
# 결과 : [1, 2, 3, 4, 5]

list1[:]은 리스트 list1의 모든 요소를 선택하여 자르는 구문이다. 이렇게 잘린 리스트는 원본 리스트와는 별도의 리스트로 반환되기 때문에 6번과 7번 라인을 통해 리스트가 제대로 복사되었음을 확인할 수 있다.
 
 

  • 리스트끼리의 연산

리스트끼리 더하거나 리스트에 숫자를 곱할 수도 있다. 리스트끼리의 더하기(+) 연산은 두 리스트를 서로 연결시켜주며, 리스트와 정수의 곱하기(*) 연산은 해당 리스트의 모든 요소들을 정수배만큼 반복해서 연결해 줍니다.

list1 = [1, 2, 3]

list2 = list((4, 5, 6))


print(list1 + list2)
# 결과 : [1, 2, 3, 4, 5, 6]

print(list1 * 3)  
# 결과 : [1, 2, 3, 1, 2, 3, 1, 2, 3]

list1.extend(list2)
print(list1)
# 결과 : [1, 2, 3, 4, 5, 6]

 
list1 = [1, 2, 3] -> 대괄호를 사용하여 리스트를 직접 생성한다.
list2 = list((4, 5, 6)) -> 튜플 (4, 5, 6)을 생성한 후에 list() 함수를 사용하여 이 튜플을 리스트로 변환한 것이다. list2는 숫자 4, 5, 6이 포함된 리스트가 된다. 이때 list() 함수의 인수로는 순환할 수 있는 객체(iterable object)만을 사용할 수 있다.
 
Q. 순환 가능한 객체란?
여러 요소로 이루어진 객체를 순회할 수 있는 객체이다. 주로 리스트, 튜플, 집합, 딕셔너리와 같이 여러 요소를 가지고 있는 객체들이 순환 가능한 객체이다. 순환 가능 객체가 아닌 것은? 정수나 문자열과 같은 단일 값은 순환 가능한 객체가 아니다.
 
extend() 함수를 사용하면 더하기(+) 연산과 마찬가지로 하나의 리스트에 다른 리스트를 연결할 수 있습니다. 단, 리스트끼리의 더하기(+) 연산은 원본 리스트에는 전혀 영향을 미치지 않지만, extend() 함수는 원본 리스트 그 자체를 변경하는 점이 다르다.
 
 

  • 리스트에 요소 추가하거나 제거하기

append() 함수전달된 인수를 해당 리스트의 마지막 요소로 추가하고, remove() 함수전달된 인수를 해당 리스트에서 찾아 제거합니다.

list1 = [1, 2, 3, 4, 5]

list1.append(2)
print(list1)  
# 결과 : [1, 2, 3, 4, 5, 2]

list1.remove(3)
print(list1)  
# 결과 : [1, 2, 4, 5, 2]
 
list1.remove(2)
print(list1)
# 결과 : [1, 4, 5, 2]

 
만약 remove() 함수에 인수로 전달한 요소가 해당 리스트에 두 개 이상 존재할 경우에는 인덱스가 가장 낮은 요소 하나만을 삭제하게 됩니다.
 
 

  • 리스트에 요소 삽입하거나 꺼내기

insert() 함수는 해당 리스트의 지정된 인덱스에 전달된 인수를 요소로 삽입하며, pop() 함수전달받은 인덱스에 위치한 요소를 리스트에서 추출하여 반환한다. insert() 함수는 첫 번째 인수로 요소를 삽입할 인덱스를 전달받고, 두 번째 인수로 삽입할 요소를 전달받는다.

list1 = [1, 2, 3, 4, 5]

list1.insert(3, 9)
print(list1)  
# 결과 : [1, 2, 3, 9, 4, 5]
# 3번째 인덱스 위치에 9 삽입됨.

list1.pop(4)
print(list1)
# 결과 : [1, 2, 3, 9, 5]
# 4번째 인덱스 요소인 4 추출됨.

 
 

  • 리스트 뒤집거나 정렬하기

reverse() 함수리스트의 모든 요소를 역순으로 뒤집어서 반환하며, sort() 함수리스트의 모든 요소를 순서대로 정렬해준다.

list1 = [5, 2, 4, 1, 3]
list2 = [5, 2, 4, 1, 3]


list1.reverse()
print(list1)  
# 결과 : [3, 1, 4, 2, 5]

list1.sort()
print(list1)
# 결과 : [1, 2, 3, 4, 5]

print(sorted(list2))
# 결과 : [1, 2, 3, 4, 5]

print(list2)
# 결과 : [5, 2, 4, 1, 3]

 
파이썬의 내장 함수인 sorted() 함수를 사용해도 리스트를 정렬할 수 있다.

이때 리스트 함수인 sort() 함수는 원본 리스트 그 자체를 정렬하여 변경하지만, 파이썬 내장 함수인 sorted() 함수는 원본 리스트는 변경하지 않고 정렬된 새로운 리스트를 반환해 준다.

 

 

  • 중첩 리스트

리스트의 요소로 또 다른 리스트를 추가할 수 있으며, 이때 중첩된 안쪽 리스트의 특정 요소의 인덱스는 두 개의 대괄호([][])를 사용하여 표시할 수 있다. 중첩 리스트에서 첫 번째 인덱스는 바깥쪽 리스트의 인덱스로 인식되며, 두 번째 인덱스는 안쪽 리스트의 인덱스로 인식된다.

matrix = [[1, 2, 3], ["하나", "둘", "셋"]]  

print(matrix[0])
# 결과 : [1, 2, 3]

print(matrix[0][0])
# 결과 : 1

print(matrix[1][2])
# 결과 : 셋

 

 

'Algorithm' 카테고리의 다른 글

[ 알고리즘 ] DFS, BFS 란?  (0) 2024.04.06
[ Python ] 정렬 (2) - list 예시  (0) 2024.04.05
[ SQL ] JOIN 과 UNION 사용 예시  (0) 2024.04.03
[ 알고리즘 ] 스택/큐 이론  (0) 2024.04.02
[ SQL ] SQL 연산자 ( IN, EXISTS )  (0) 2024.03.25