본문 바로가기

Programming/Python

[Python] 파이썬 리스트(list) 사용 방법

반응형

리스트(list)는 프로그래밍에서 많이 사용되는 데이터 구조입니다.

특정 데이터를 반복적으로 처리하는데 특화되어 있습니다.

파이썬 list

파이썬에서 제공하는 리스트는 C++의 vector나 자바의 ArrayList와 유사합니다.

파이썬의 리스트는 다양한 타입을 한 리스트에 저장하는 것이 가능합니다.

리스트를 통해 데이터를 순차적으로 접근하거나 임의의 위치의 데이터를 접근할 수 있습니다.

파이썬 리스트를 사용하는 방법을 알아보도록 하겠습니다.

 

1. list 생성

파이썬에서 리스트를 생성하는 방법은 다음과 같습니다.

a = []
b = [1, 2, 3]
c = list()

리스트는 []로 표현되기 때문에 간단하게 []를 통해 빈 리스트를 생성(a)할 수 있습니다.

혹은 리스트에 데이터를 넣으면서 생성(b)하거나 list() 생성자를 사용해서 빈 리스트를 생성(c)할 수 있습니다.

원하는 방식을 선택해서 리스트를 생성하면 됩니다.

 

2. list 연산

파이썬은 리스트를 위해 몇 가지 연산을 제공합니다.

더하기와 곱하기 연산을 통해 리스트를 좀 더 편리하게 만들 수 있습니다.

a = [1, 2]
b = [3, 4]
c = a + b
d = [0] * 10

print(c)
print(d)

더하기 연산은 두 리스트를 합친 새로운 리스트를 생성합니다.

곱하기 연산은 리스트를 곱한 숫자만큼 반복시켜서 새로운 리스트를 생성합니다.

결과

두 개 이상의 리스트를 하나로 합치고 싶은 경우 더하기 연산자를 사용하면 됩니다.

곱하기 연산자는 특정 값으로 전체를 채우고 싶을 때 사용할 수 있습니다.

 

3. list 길이 확인

리스트의 길이는 len() 메소드를 통해 확인 가능합니다.

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

리스트에 4개의 값이 포함되어 있기 때문에 4를 리턴합니다.

 

4. 인덱싱과 슬라이싱

인덱싱과 슬라이싱은 파이썬이 제공하는 편리한 기능 중 하나입니다.

인덱싱은 특정 인덱스의 값을 가져올 때 사용합니다.

a = ['Red', 'Green', 'Blue', 'Yellow', 'Black', 'White']
print(f'0: {a[0]}')
print(f'1: {a[1]}')
print(f'-1: {a[-1]}')
print(f'-2: {a[-2]}')

인덱스는 0부터 시작해서 처음 값부터 순서대로 가져오게 됩니다.

인덱싱에서 -1은 가장 끝에 위치한 값을 가져오며 -2, -3과 같이 값을 점점 낮추면서 역으로 가져올 수 있습니다.

결과

-1을 사용하면 쉽게 가장 마지막 값을 가져올 수 있습니다.

슬라이싱은 1~3번째 값들과 같이 특정 범위의 값을 한 번에 가져오고 싶을 때 사용합니다.

a = ['Red', 'Green', 'Blue', 'Yellow', 'Black', 'White']
print(f'a[:]: {a[:]}')  # ['Red', 'Green', 'Blue', 'Yellow', 'Black', 'White']
print(f'a[3:]: {a[3:]}')  # ['Yellow', 'Black', 'White']
print(f'a[:3]: {a[:3]}')  # ['Red', 'Green', 'Blue']
print(f'a[3:5]: {a[3:5]}')  # ['Yellow', 'Black']
print(f'a[1:6:2]: {a[1:6:2]}')  # ['Green', 'Yellow', 'White']
print(f'a[::-1]: {a[::-1]}')  # ['White', 'Black', 'Yellow', 'Blue', 'Green', 'Red']

슬라이싱은 인덱싱과 같이 []를 사용하며 :로 범위를 구분합니다.

[시작 인덱스(포함):끝 인덱스(미포함):증가값]

슬라이싱에서 시작 인덱스의 값은 포함되지만 끝 인덱스의 값은 포함되지 않습니다.

첫 번째 슬라이싱은 시작 인덱스와 끝 인덱스를 생략시킨 형태입니다.

시작 인덱스 생략 시 첫 번째 값부터 가져오며 끝 인덱스 생략 시 마지막 값까지 가져옵니다.

그렇기 때문에 시작 인덱스와 끝 인덱스를 모두 생략시키면 처음부터 끝까지 모든 값을 가져옵니다.

혹은 시작 인덱스나 끝 인덱스 중 하나만 생략하는 것도 가능합니다.

끝 인덱스의 값은 포함되지 않기 때문에 a[3:5]의 경우 3, 4 번째만 포함되고 5 번째는 포함되지 않습니다.

증가 값은 보통 생략하며 1씩 증가합니다.

증가 값을 설정하면 값을 건너뛰며 가져오는 것이 가능합니다.

a[1:6:2]의 경우 1부터 5 사이의 값을 가져오는데 1, 3, 5 번째만 가져오는 것을 확인할 수 있습니다.

마지막으로 [::-1]의 경우 원래 리스트를 뒤집은 형태의 리스트를 생성할 때 사용할 수 있습니다.

결과

실제 결과를 확인하면 어떻게 동작하는지 쉽게 파악이 가능합니다.

 

5. list 값 추가/삭제

리스트에 값을 추가하거나 존재하는 값을 변경 또는 삭제하는 다양한 방법을 제공합니다.

a = [1, 2, 3, 4]
# append
a.append(5)
print(f'append: {a}')

# insert
a.insert(0, 0)
print(f'insert: {a}')

값을 추가할 때는 append()나 insert()를 호출하면 됩니다.

append()는 항상 가장 끝에 값을 추가하며 insert()는 인덱스를 지정할 수 있습니다.

insert()를 통해 중간에 값을 입력하면 입력된 위치의 값부터는 모두 한 칸씩 밀리게 됩니다.

결과

값을 삭제할 때는 remove()를 호출하거나 외부의 del()을 호출하면 됩니다.

a = [0, 1, 2, 3, 4, 5]
# remove
a.remove(5)
print(f'remove: {a}')

# remove exception
try:
    a.remove(5)
except ValueError:
    print('5 is not found.')

# del
del (a[3:5])
print(f'del: {a}')

# pop
pop = a.pop()
print(f'pop: {a}')

remove()를 호출할 때는 삭제를 원하는 값을 입력하면 됩니다.

여러 동일한 값이 있어도 remove()는 가장 처음에 나오는 1개의 값만 삭제합니다.

remove()는 값이 없는 경우 ValueError 예외를 발생시키기 때문에 예외 처리를 추가해야 합니다.

혹은 슬라이싱이나 인덱싱을 활용해서 del()로 삭제하는 것도 가능합니다.

pop() 역시 값을 제거하는 데 사용되는데 인덱스를 입력하면 해당 위치의 값을 삭제하고 리턴합니다.

pop()을 호출할 때 위와 같이 인덱스를 입력하지 않으면 가장 마지막의 값을 삭제하고 리턴합니다.

리스트에서 값을 하나씩 삭제하고 동시에 처리해야 하는 경우 pop()을 사용하면 됩니다.

결과

마지막으로 리스트와 리스트를 결합할 때 extend()를 사용할 수 있습니다.

a = [0, 1]
# extend
b = [2, 3, 4]
a.extend(b)
print(f'extend: {a}')

덧셈 연산자와 유사하지만 덧셈 연산자가 새로운 리스트를 생성하지만 extend()는 호출한 객체의 값이 변경됩니다.

결과

a 리스트의 값이 변경된 것을 확인할 수 있습니다.

 

6. 기타 list 메소드

list에는 이 외에 몇 가지 메소드가 더 존재합니다.

먼저 리스트의 순서를 뒤집기 위한 reverse() 메소드가 있습니다.

a = [1, 2, 3, 4]
a.reverse()
print(a)  # [4, 3, 2, 1]

reverse()를 호출하면 리스트의 값들이 역순으로 순서가 변경됩니다.

역순으로 새로운 리스트를 생성할 때는 슬라이싱을 활용하면 됩니다.

a = [1, 2, 3, 4]
b = a[::-1]
print(b)  # [4, 3, 2, 1]

그리고 동일한 리스트를 새롭게 생성할 때 copy()를 사용할 수 있습니다.

a = [1, 2, 3, 4]
b = a.copy()
print(b)  # [1, 2, 3, 4]

혹은 슬라이싱(a[:])를 사용해도 동일하게 복사가 가능합니다.

슬라이싱이나 copy()를 사용해야 깊은 복사를 통해 새로운 리스트가 생성됩니다.

아래와 같이 대입을 통해서 리스트를 복사하는 경우 얕은 복사가 발생합니다.

a = [1, 2, 3, 4]
b = a
a[0] = 0
print(a)  # [0, 2, 3, 4]
print(b)  # [0, 2, 3, 4]

이 경우 a의 값을 변경하면 b 역시 영향을 미치는 것을 볼 수 있습니다.

원하는 동작에 따라 깊은 복사나 얕은 복사를 선택해서 사용하면 됩니다.

그리고 리스트 안에 특정 값이 몇 개 존재하는지 확인할 때는 count()를 사용합니다.

a = [1, 2, 2, 2, 3, 4]
print(a.count(2))  # 3
print(a.count(0))  # 0

여기서 2는 3개 존재하고 0은 존재하기 때문에 각각 3과 0을 리턴합니다.

count()가 0을 리턴하는 여부에 따라 값이 존재하는지를 판단할 수 있지만 일반적으로는 in을 사용합니다.

a = [1, 2, 2, 2, 3, 4]
if a.count(2) > 0:
    print('2 is in list')

if 2 in a:
    print('2 is in list')

count()는 특정 값이 몇 개나 포함되어 있는지 확인하는 용도로 사용하면 됩니다.

특정 값이 어떤 인덱스에 위치하고 있는지 확인할 때는 index()를 사용합니다.

a = [1, 2, 3, 4]
print(a.index(2))
try:
    print(a.index(0))
except ValueError:
    print('0 is not in list')

2는 1번 인덱스에 위치하고 있기 때문에 1을 리턴합니다.

index()를 호출할 때 값이 존재하지 않으면 ValueError예외가 발생하기 때문에 해당 예외를 처리해야 합니다.

마지막은 정렬을 위한 sort()함수입니다.

a = [3, 2, 1, 4, 5]
a.sort()
print(a)  # [1, 2, 3, 4, 5]

a.sort(reverse=True)
print(a)  # [5, 4, 3, 2, 1]

sort()를 호출하면 간단하게 내부의 값들이 정렬됩니다.

reverse를 True로 설정하면 역순으로 정렬되는 것을 확인할 수 있습니다.

list는 일반적으로 가장 많이 사용되는 데이터 타입이기 때문에 기본적인 동작을 외워두면 편리합니다.

반응형