본문 바로가기

자료구조

[Python/파이썬] 배열 연산자 - 추가 및 삭제

이 글에서는 리스트를 사용하여 배열에 원소를 추가 및 삭제하는 방법을 배워보겠습니다. 튜플 타입의 경우 수정이 불가능 하기 때문에 대부분의 함수를 사용 할 수 없습니다. 만약 튜플 타입에 대해 궁금하시다면 먼저 이 글을 읽고 와 주세요! 

 

먼저 기본적으로 사용하게 될 리스트는 myList = [1, 2, 3, 4, 5]입니다.

1. 리스트에서 원소를 추가 및 확장하기

리스트에서 원소를 추가할 때에는 여러 가지 방법들이 있습니다. 그중 가장 많이 쓰이는 5가지 방법을 소개하겠습니다. 

1.1. append() 사용하기

첫 번째는 방법은 append() 함수를 사용하는 방법입니다. 리스트의 이름. append(데이터의 값)으로 사용할 수 있으며, 원소가 가장 마지막에 추가되는 것을 확인할 수 있습니다.

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

# append() 함수 사용법
x = myList.append(6) # or myList.append(6)
print(myList) # [1,2,3,4,5,6]
print(x) # None

다만, append() 함수 내에 데이터 값이 존재하지 않는 경우() TypeError 볼 수 있습니다. append() 함수를 사용하시는 경우 반드시 괄호 내에 값을 1개만!! 적어 주세요!

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

# append() 사용시 생길 수 있는 Error
myList.append() # <- TypeError
myList.append(6,7,8) # <-TypeError

1.2. insert() 사용하기

두 번째는 insert() 함수를 사용하는 방법입니다.  리스트의 이름 +. insert(데이터가 들어갈 위치, 데이터의 값)으로 사용할 수 있으며, 데이터가 insert 함수에 넣은 인덱스 위치에 추가되는 것을 볼 수 있습니다.  

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

# insert() 함수 사용법
x = myList.insert(2,7) # or myList.insert(2,7)
print(myList) # [1,2,7,3,4,5] <- 2번째 자리에 7이 추가됨
print(x) # None

그렇다면 인덱스 값을 리스트의 크기보다 크게 해서 넣게 되면 어떻게 될까요?? 아래의 그림처럼 인덱스 값이 리스트의 크기보다 크다면 리스트의 가장 마지막(왼쪽)에 원소를 추가하게 됩니다. 마치 append() 함수처럼요!!

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

# 리스트 크기보다 큰 인덱스 값을 넣는다면
myList.insert(100,7) 
print(myList) # [1,2,3,4,5,7] <- 마지막 위치에 7이 추가됨

만약 insert() 함수에서 index 위치에 음수를 넣으면 어떻게 될까요?

 

이때에는 앞의 글과 비슷하게 인덱스가 바뀌어서 원소를 추가하게 됩니다. 다만 인덱스 '-1' 값이 가장 왼쪽 마지막부터 시작하는게 아니라 그 앞의 원소에서 시작하는 점을 주의해 주세요!!  만약 왜 인덱스 '-1' 값이 왼쪽 끝부터 시작하지 않는지에 대해 궁금하시다면, 여기를 눌러서 Stack Overflow의 글을 읽어주세요!

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

# 인덱스에 음수를 넣는다면!
myList.insert(-1,7) 
print(myList) # [1,2,3,4,7,5] <- 7의 위치 확인!!

인덱스의 음수의 값 또한 마찬가지로, 음수인 인덱스 값이 리스트의 크기를 초과하게 된다면 리스트의 가장 처음(오른쪽)에 원소를 추가시킵니다.   

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

# 리스트 크기보다 더 큰 음의 인덱스 값을 넣는다면
myList.insert(-100,7) 
print(myList) # [7,1,2,3,4,5] # 데이터가 가장 왼쪽에 들어가는 것을 확인!

주의해야 할 것은 append() 함수와 insert() 함수들은 연산만 수행할 뿐, return 값이 없기에 print() 문으로 확인해 보면 "None" 값이 리턴되는 것을 볼 수 있습니다.  

1.3. extend() 사용하기

세 번째는 extend() 함수를 사용하는 방법입니다. extend() 함수는 append() 함수와 비슷하면서도 다른 점이 있습니다. 먼저, 새로운 tmpList를 기존에 사용하던 myList에 append() 함수와 extend() 함수를 사용하여 추가해 보겠습니다.

새로 추가하게 될 tmpList = [6, 7, 8]입니다.

먼저 append() 함수를 사용하게 되면 하나의 메모리 공간에 tmpList의 데이터 전체가 리스트 형식으로 저장되게 됩니다.

myList = [1,2,3,4,5]
tmpList = [6,7,8]

myList.append(tmpList) # tmpList를 append()함수를 사용하여 추가
print(myList) # [1,2,3,4,7,5,[6,7,8]] <- 리스트 전체가 한개의 원소로 추가됨

그렇다면 리스트 내의 각각의 원소들을 myList에 추가하고 싶다면 어떻게 해야 할까요?이럴 때 extend() 함수를 사용하면 됩니다! extend() 함수는 추가하려는 tmpList 내의 각 원소들을 읽어내서 myList에 추가합니다. 

myList = [1,2,3,4,5]
tmpList = [6,7,8]

myList.extend(tmpList) # tmpList를 extend()함수를 사용하여 추가
print(myList) # [1,2,3,4,7,5,6,7,8] <- tmpList의 원소가 각각 추가됨

주의해야 할 점은 extend() 함수는 괄호 내에 1개의 데이터를 받는데, 그 데이터는 반복(iterate) 문으로 원소들을 읽어 낼 수 있는 리스트나 딕셔너리 타입이어야만 합니다. 만약 extend() 함수 내에 6과 같이 반복되지 않는 원소 그대로를 집어넣거나 데이터가 여러 개 들어올 경우 TypeError를 나타내게 됩니다. 

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

# 다양한 데이터를 extend()를 사용하여 추가
myList.extend([6])
print(myList) # [1,2,3,4,7,5,6]

myList.extend('abcde')
print(myList) # [1,2,3,4,7,5,6,'a','b','c','d','e']

# extend() 관련 Error 모음
myList.extend(6) # TypeError
myList.extend(6,7,8) # TypeError

1.4. '+' 연산자 사용하기

네 번째 방법은 '+'와 같은 덧셈 연산자를 사용하는 방법입니다. 먼저  '+'연산자는 extend() 함수와 비슷하게 추가하려는 리스트의 각 원소들을 기존 리스트에 각각 추가합니다.

myList = [1,2,3,4,5]
tmpList = [6,7,8]

myList += tmpList # or myList = myList + tmpList
print(myList) # [1,2,3,4,7,5,6,7,8]

다만, extend() 함수와의 차이점은 리스트는 리스트 타입끼리, 튜플은 튜플 타입끼리만 사용 가능합니다. 만약 '+' 연산자를 통해 다른 타입끼리 합하려고 한다면 TypeError를 볼 수 있습니다.

# 튜플타입 또한 '+'연산자 사용 가능!
a = (1,2,3) + (4,5,6) 
print(a) # (1,2,3,4,5,6)

# '+'연산자 관련 Error 모음
b = (1,2,3) + [4,5,6] # TypeError
c = [1,2,3] + '456' # TypeError
d = [1,2,3] + 456 # TypeError

1.5. '*' 연산자 사용하기

마지막 방법은 '*'와 같은 곱셈 연산자를 이용하여 기존 리스트나 튜플의 원소들을 반복하여 확장시켜 주는 방법입니다.

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

myList *= 3 # or myList = myList * 3
print(myList) # [1,2,3,4,5,1,2,3,4,5,1,2,3,4,5] <- 정확히 3번 반복되어 추가된 것을 볼 수 있음

myTuple = (1,2,3)
myTuple *= 2 # or myTuple = myTuple * 3
print(myTuple) # (1,2,3,1,2,3)

다만 주의할 점은 '*' 연산자에는 int타입의 수만 들어올 수 있습니다. float 타입, string 타입, 혹은 다른 리스트나 튜플을 리스트에 곱할 경우 TypeError를 보실 수 있습니다.

# 곱셈 연산자 Error 모음
a = [1,2,3] * 3.14 # TypeError
b = [1,2,3] * [4] # TypeError
c = [1,2,3] * '3 times' # TypeError
d = (1,2,3) * [4,5] # TypeError

2. 리스트에서 원소를 삭제하기

리스트에서 원소를  삭제할 때에도 마찬가지로 여러 가지 방법들이 있으나, 아래에서는 가장 대중적으로 사용되는 4가지 방법들을 설명하겠습니다. 

2.1. Remove() 사용하기

첫 번째는 방법은 remove() 함수를 사용하는 방법입니다. 리스트의 이름. remove(데이터의 값)으로 사용할 수 있으며, 리스트 내에 원소가 존재할 경우 원소가 삭제되는 것을 확인할 수 있습니다.

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

# Remove 함수 사용법
x= myList.remove(3) 
print(myList) # [1,2,4,5]
print(x) # None

다만, remove 함수 내에 데이터 값이 존재하지 않는 경우() ValueError 볼 수 있습니다. 또한, 위의 두 함수처럼, 연산만 수행하는 함수이기 때문에 return값이 존재하지 않습니다.

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

# remove() 함수 사용시 발생되는 Error
myList.remove(6) # ValueError -> 삭제하려는 값이 존재하지 않을 때
myList.remove()  # TypeError -> 삭제하려는 값을 주지 않을 때
myList.remove(1,2,3) # TypeError -> 괄호 안에 1개 이상의 값을 줄 때

2.2. Pop() 사용하기

두 번째는 pop() 함수를 사용하는 방법입니다.  리스트의 이름 +. pop(데이터의 위치)으로 사용할 수 있으며, index에 위치한 원소가 추출된 후 삭제되는 것을 볼 수 있습니다.

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

# Pop
x= myList.pop(3) # 인덱스 값을 지정
print(myList) # [1,2,3,5]
print(x) # 4

pop() 함수의 경우, 괄호 안에 인덱스 값을 넣어주지 않는다면 가장 마지막 원소를 추출 후 제거하는 것을 볼 수 있으며, 데이터를 추출해 내기 때문에 return 값으로 삭제되는 데이터 값을 반환받습니다.

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

a = myList.pop() # index 값을 넣어주지 않음
print(myList) # [1,2,3,4] 
print(a) # 5 <- 마지막 원소가 추출됨

다만 비어있는 리스트에서 pop() 함수를 사용하거나 pop() 함수 내 index가 리스트의 범위보다 큰 경우 IndexError를 볼 수 있습니다.

# pop() 함수 사용시 발생되는 Error
myList = [1,2,3,4,5]
# myList.pop(6) -> IndexError

# myList = []
# myList.pop()  -> IndexError

2.3. del 사용하기

세 번째 방법은 del 키워드를 사용하는 방법입니다.  del 리스트이름[index]으로 사용할 수 있으며, index에 위치한 원소를 제거하고 나머지를 좌측으로 이동시키는 것을 볼 수 있습니다.

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

del myList[3]
print(myList) # [1,2,3,5]

또한, 인덱스에 [A:B]와 같이 슬라이싱을 사용하여 범위를 지정해 삭제할 수도 있습니다.

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

del myList[1:3]
print(myList) # [1,4,5]

만약 인덱스 내에 범위를 지정해 주지 않을 경우 SyntaxError를 볼 수 있으며, 리스트 이름만 적을 경우 리스트 전체가 사라질 수 있기 때문에 주의해야 합니다. 

# del 키워드 사용시 유의점
myList = [1,2,3,4,5]
del myList[] # SyntaxError <- 괄호 안에 인덱스 지정을 안해줌

# del 을 통한 리스트 초기화
myList = [1,2,3,4,5]
del myList[:] # <- [:] 는 전체 선택, del을 통해 리스트 데이터를 삭제
print(myList) # []

# del 을 통한 리스트 삭제
myList = [1,2,3,4,5]
del myList # <- 인덱스 범위를 지정해 주지 않을 경우 myList 전체를 삭제
print(myList) # NameError -> myList가 삭제되서 myList라는 객체가 없음

2.4. clear() 사용하기

마지막 방법은 clear()함수를 사용해서 리스트를 빈 배열로 초기화 시켜주는 것입니다. del 키워드에 모든 인덱스를 선택하는 방법과 마찬가지로 clear() 함수를 사용하면 배열의 형태를 유지하면서 배열 안의 모든 원소만 안전히 지울 수 있습니다.  

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

# del 키워드 사용 시
del myList[:] 
print(myList) # [ ]

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

# clear() 함수 사용 시
x = myList.clear() 
print(myList) # [] 
print(x) # None

clear() 함수는 배열을 초기화 시켜주는 함수기 때문에 괄호 안에 어떤 input 값을 받지 않습니다. 만약, 괄호 안에 데이터를 넣는다면 TypeError를 볼 수 있습니다. 

myList = [1,2,3,4,5]
myTuple = (1,2,3,4,5)

# clear() 함수 사용 중 발생 할 수 있는 Error
myList.clear(5) # TypeError -> 괄호 안에 데이터를 넣을 수 없음
myTuple.clear() # AttributeError -> 튜플 타입에는 clear()함수 사용 불가