LainyZine: 프로그래머 가이드 🐣

[Python] 리스트(배열) 요소를 삭제 방법: clear, del, remove, pop

파이썬에서 리스트(list) 타입은 여러 개의 요소들로 구성될 수 있습니다. 이 중에서 특정 요소를 삭제하고 싶을 때 사용할 수 있는 몇 가지 방법들이 있습니다. 상황에 따라 del 구문을 사용하거나, clear, remove, pop 메서드를 사용하는 방법도 있습니다. 또한 리스트 컴프리헨션(list comprehension)을 사용해 특정 조건에 맞는 요소들만 일괄적으로 삭제하는 것도 가능합니다. 이 글에서는 리스트에서 요소를 삭제하는 여러 가지 방법들을 총 정리합니다.

del 구문: 인덱스나 슬라이스로 특정 범위의 요소를 삭제

파이썬의 del 구문을 사용하면 리스트의 특정 위치의 요소를 삭제할 수 있습니다. 이 때 del 구문은 리스트의 메서드가 아님에 유의해주세요.

인덱스는 0부터 시작합니다. 예를 들어 첫 번째 요소의 인덱스는 0, 두 번째 요소의 인덱스는 1이 됩니다. 인덱스를 음수로 지정하면 맨 뒤의 요소를 가리킵니다. 예를 들어 -1은 맨 뒤에서 첫 번째 요소, -2는 맨 뒤에서 두 번째 요소가 됩니다. del 구문으로 특정 인덱스의 요소를 삭제하는 간단한 예제입니다(예제 코드는 별도의 표기가 없다면 Python 3.9에서 실행했습니다).

>>> primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
>>> print(primes)
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]

>>> del primes[0]
>>> print(primes)
# 첫번째 요소 3이 삭제됨
[3, 5, 7, 11, 13, 17, 19, 23, 29]

>>> del primes[1]
>>> print(primes)
# 2번째 요소 5가 삭제됨
[3, 7, 11, 13, 17, 19, 23, 29]

>>> del primes[-1]
>>> print(primes)
# 맨 마지막 요소 29가 삭제됨
[3, 7, 11, 13, 17, 19, 23]

단, 지정한 인덱스가 실제 리스트의 범위를 초과하는 경우 IndexError가 발생합니다.

>>> primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
>>> del primes[10]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
Input In [51], in <cell line: 1>()
----> 1 del primes[10]

IndexError: list assignment index out of range

슬라이스를 사용해 특정 범위의 값들을 삭제하는 것도 가능합니다.

>>> primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]

>>> del primes[0:2]
>>> print(primes)
[5, 7, 11, 13, 17, 19, 23, 29]

슬라이스 문법을 활용하는 것도 가능합니다. 예를 들어 5:와 같이 슬라이스를 지정하면, 6번째 이후의 모든 요소를 삭제합니다. :를 지정하면 clear() 메서드와 같이 모든 요소를 삭제합니다. 0:6:2와 같이 슬라이스 뒤에 :를 하나 더 붙이면 step을 지정할 수 있습니다.

>>> del prime[5:]
>>> print(primes)
[5, 7, 11, 13, 17]

>>> del primes[:]
>>> print(primes)
[]

>>> primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
>>> del primes[0:6:2]
>>> print(primes)
[3, 7, 13, 17, 19, 23, 29]

clear(): 리스트의 모든 요소를 삭제

리스트의 메서드 clear()를 실행하면, 해당 리스트의 모든 요소가 삭제 되고 빈 리스트만 남습니다.

>>> primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]

# primes 변수에서 clear() 메서드 실행. 모든 요소가 삭제됨.
>>> primes.clear()
>>> print(primes)
[]

파이썬에선 리스트의 요소에 타입 제한이 없습니다. 숫자들만으로 이루어진 단일 타입 배열을 사용하는 경우 array 표준 라이브러리를 사용할 수 있습니다. array 타입 역시 비슷한 방법으로 요소들을 삭제할 수 있지만, clear() 메소드는 정의되어있지 않습니다. 따라서 이 경우 AttributeError 에러가 발생합니다.

>>> arr = array.array('i', [2, 3, 5, 7, 11, 13, 17, 19, 23, 29])
>>> arr.clear()
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Input In [15], in <cell line: 1>()
----> 1 arr.clear()
AttributeError: 'array.array' object has no attribute 'clear'

remove(): 입력한 값을 검색해서, 첫 번째 검색 결과를 삭제

remove()는 값를 검색해서 요소를 삭제할 수 있는 리스트의 메서드입니다. remove의 인자로 입력한 숫자 13만 삭제됩니다.

>>> primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
>>> primes.remove(13)
13

>>> print(primes)
[2, 3, 5, 7, 11, 17, 19, 23, 29]

리스트에 같은 값이 여러개 있을 경우 첫 번째 값이 삭제됩니다.

>>> fruits = ['lemon', 'apple', 'banana', 'apple', 'apple']
>>> furits.remove('apple')
>>> print(fruits)
['lemon', 'banana', 'apple', 'apple']

존재하지 않는 값을 검색하는 경우 ValueError가 발생합니다.

>>> fruits.remove('pineapple')
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Input In [63], in <cell line: 1>()
----> 1 fruits.remove('pineapple')

ValueError: list.remove(x): x not in list

pop(): 맨 뒤의 값을 삭제. 인자를 지정할 경우 특정 위치의 값을 삭제

스택의 pop, push 개념을 알고있다면, 리스트의 pop() 메서드도 쉽게 이해할 수 있습니다. pop() 메서드는 리스트의 마지막 요소를 삭제합니다. 단순히 삭제만 하는 것은 아니고, 이 마지막 값을 반환해줍니다.

primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
print(primes.pop())
# => 29

인자를 지정할 경우 특정 인덱스의 값을 삭제하고 반환받을 수 있습니다. 이 때 첫 번째 값의 인덱스는 0이며, 마지막 값을 지정하고자 하는 경우 음수 -1을 지정할 수 있습니다. 단, 존재하지 않는 인덱스를 지정할 경우 IndexError 에러가 발생합니다.

>>> print(primes.pop(0))
2
>>> print(primes.pop(-1))
19

>>> print(primes.pop(10))
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
Input In [69], in <cell line: 1>()
----> 1 print(primes.pop(10))

IndexError: pop index out of range

단, pop() 메서드의 기본적인 원리상 중간에 있는 값을 지정할 경우 시간 복잡도가 O(n)이므로 주의가 필요합니다.

리스트 컴프리헨션으로 특정 조건에 일치하지 않는 요소를 삭제하기

리스트 컴프리헨션을 사용하면 간단하게 특정 조건으로 리스트의 값들을 필터링할 수 있습니다. 예를 들어 아래 예제에서는 0부터 50까지의 숫자 중에서 7의 배수가 아닌 값들을 삭제합니다. 즉, 7의 배수인 숫자들만 새로운 배열에 남게됩니다.

>>> nums = list(range(50))
>>> new_nums = [i for i in nums if i % 7 == 0]
>>> print(new_nums)
[0, 7, 14, 21, 28, 35, 42, 49]

여기까지 del 구문, clear() 메서드, remove() 메서드, pop() 메서드, 리스트 컴프리헨션 등 파이썬에서 리스트의 요소를 삭제하는 다양한 방법들에 대해서 알아보았습니다.

LainyZine은 쿠팡 파트너스 활동에 따른 수수료를 제공받습니다.