본문 바로가기
Python/파이썬 기초

[Python] 자료구조 1 - 리스트

by isfp_yykkng 2023. 2. 17.

자료구조 - 리스트

⚠️장문주의⚠️

 

자료구조 : 데이터를 구조화할 때 사용하며, 파이썬의 자료구조는 리스트(list), 튜플(tuple), 딕셔너리(dictionary)가 있다.

리스트

리스트(list) : 여러개의 값을 담을 수 있는 변수

  • 리스트 아이템은 문자열, 정수, 실수, boolean형 등 모두 가능하다. 
  • 리스트 아이템 간에는 순서가 존재한다. (=> 시퀀스 데이터)
  • 리스트 아이템은 index로 순서를 정하고 index는 0번부터 시작한다.

리스트 생성법 

1. 대괄호 이용

리스트명 = [리스트아이템1, 리스트아이템2, ... ]

2. 비어있는 리스트 생성 (list() 함수 이용)

<리스트를 담을 변수> = list()

2번 방법은 리스트를 생성할 수 있지만, 비어있는 리스트를 생성한다.

list1 = ["Mon", "Tue", "Wed", "Thu","Fri"]
list2 = [] # 빈 리스트 생성
list3 = list() # 빈 리스트 생성

리스트의 덧셈, 곱셈

  • 리스트의 덧셈 (리스트끼리) : 리스트를 이어 붙인다.
  • 리스트의 곱셈 (리스트 * 숫자 ): 리스트를 숫자만큼 반복해서 만든다. (0을 곱하면 빈 리스트) 
list1 = ['python',3]
list2 = [1, 4, 9, 16]

print(list1 + list2) # 결과 : ['python', 3, 1, 4, 9, 16]

list3 = [1, 2, 3]
list4 = list3 * 3
list5 = list3 * 0
print(list4) # 결과 : [1, 2, 3, 1, 2, 3, 1, 2, 3]
print(list5) # 결과 : []

리스트 인덱싱

리스트는 시퀀스 데이터 타입이라 인덱스를 이용하여 리스트 안에 아이템을 검색하고 리스트 값을 수정할 수 있다. 

길이가 n인 리스트에서 인덱스 범위는 양수로 0 ~ n-1, 음수로 -n ~ -1 이다.

길이가 n인 리스트에서..
- 첫번째 값 : <리스트명>[0]  =  <리스트명>[-n]

- 두번째 값 : <리스트명>[1]  =  <리스트명>[-n + 1]
                .

                .
- 뒤에서 두번째 값(n-1번째 값) : <리스트명>[n-2]  =  <리스트명>[-2] 
- 뒤에서 첫번째 값 (n번째 값) : <리스트명>[n-1]  =  <리스트명>[-1]

예제)

list1 = [111, 222, 333]
print(list1) # 결과 : [111, 222, 333]

list1[0] = 000 # 리스트 인덱싱 => 접근, 수정
print(list1) # 결과 : [000, 222, 333]

list1[-1] = 444
print(list1) # 결과 : [000, 222, 444]

리스트 슬라이싱

<리스트명>[ 시작index : 끝index + 1 : step ]    (시작index, 끝index 모두 생략가능)

리스트 슬라이싱(list slicing)은 리스트를 잘라버린다는 것이다. 인덱싱을 이용해서 리스트에서 필요한 부분만 잘라서 쓰는 경우에 사용한다. 클론 : 을 이용해서 원하는 부분을 자른다. ( 예제 꼭 보기!! ⭐)

a = [111, 222, 333, 444, 555, 666, 777, 888] # 길이가 8인 리스트

print(a[1:3]) # 인덱스 1 ~ 2 [222, 333]
print(a[2:8]) # 인덱스 2 ~ 7(끝) [333, 444, 555, 666, 777, 888]

# 끝까지 자를거면 : 뒤에 생략
print(a[1:]) # 인덱스 1 ~ 끝 [333, 444, 555, 666, 777, 888]

# 처음부터 원하는 부분까지 자를거면 : 앞에 생략
print(a[:3]) # 처음부터 ~ 인덱스 2 [111, 222, 333]

print(a[:8]) # 처음부터 ~ 인덱스 7(끝) [111, 222, 333, 444, 555, 666, 777, 888]
# 리스트 전체(처음 ~ 끝)를 자른다면 : 양쪽을 모두 생략 
print(a[:]) # 처음 ~ 끝 [111, 222, 333, 444, 555, 666, 777, 888]

# 마이너스 인덱스 이용
print(a[-2 : ]) # 마지막에서 2번째 ~ 끝 [777, 888]
print(a[-1 : ]) # 마지막에서 1번째(끝) ~ 끝 [888]
print(a[-5 : -2]) # 마지막에서 5번째 ~ 마지막에서 2번째 [444, 555, 666]
print(a[:-5]) # 처음 ~ 마지막에서 5번째 [111, 222, 333]

리스트 슬라이싱 응용

리스트 슬라이싱을 이용해서 reverse도 가능하고, 리스트 범위 삭제, 수정, 추가 가능하다.

1. 삭제 : del  <리스트명>[ 슬라이싱 범위 ] 

2. 수정 : <리스트명>[ 슬라이싱 범위 ] = [수정한 값들]

  • list[ 1 : 3 ] = [ 77, 88 ] 과 같이 동일한 개수로 수정, 반환
  • list[ 1 : 3 ] = [ 77, 88, 99 ] 과 같이 더 많은 개수로 수정, 반환
  • list[ 1 : 3 ] = [ 8 ] 과 같이 더 적은 개수로 수정, 반환

3. 뒤집기 (reverse) : <리스트명> [슬라이싱 범위를 음수로]

list1 = [0, 1, 2, 3, 4, 5]
list1[1:4] = [11, 22, 33] # 인덱스 1~3의 값 수정
print(list1)

list2 = list1[:] # list1을 list2에 복사한 개념
del list2[1:4]
print(list2)

list3 = list(range(20)) # 0~19의 리스트
list4 = list3[5:15:3] #step을 이용하여 슬라이싱
print(list4)

list5 = list3[-3:-16:-4] # 역으로 뒤집어서 슬라이싱 (reverse)
print(list5)

리스트 수정 (with 리스트의 대표적인 메서드)

[참고] (메서드란 2023.02.17 - [Python] - [Python] 함수 글에서 [참고] )

 

1. 리스트의 길이 구하기

: 함수 len( <리스트명> ) 이용

 

2. 리스트에 값 추가

: 리스트에 값을 추가하는 방법은 총 3가지가 있다. 

 

  • 리스트 메서드 list.append( a ) 이용 (리스트의 인덱스 끝에 새로운 값(a)을 추가)
  • 리스트 + 연산자 이용 (리스트 뒤에 새로운 리스트를 더하기)
  • 리스트 메서드 list.insert( a, b ) 이용 (특정 위치(a)에 값(b) 추가) 

* 리스트 메서드를 이용하면 해당 리스트에 값을 추가하고, + 연산자는 새로운 리스트에 기존 리스트와 추가할 리스트를 더하는 것!

 

3. 리스트에서 값 삭제

: 리스트에서 필요없는 값을 삭제하는 방법은 총 2가지가 있다.

 

  • 함수 del(리스트 범위(슬라이싱) or 특정 인덱스) 이용 :  del( <리스트명>[범위] ) /  del( <리스트명>[인덱스])
  • 리스트 메서드 list.remove( a ) 이용 (특정 인덱스(a)의 값 제거) 

*remove 메서드에서 리스트에 중복된 값 x 를 삭제한다면, 맨 처음 x를 삭제한다. 또한 없는 값을 삭제하려 한다면 에러가 발생한다. 

 

4. 그 외 (리스트 메서드 이용)

 

  • list.count(  a  ) 이용해서 리스트 값 x의 개수 세기 (값 x가 리스트에 몇개 들었는지 반환)
  • list.copy() 이용해서 리스트 복사 (해당 리스트 복사 후 반환) 
  • list.reverse() 이용해서 리스트 뒤집기
  • list.sort() 이용해서 리스트 오름차순 정렬 (주의!! 내부 요소의 데이터 타입이 같아야 함.) 
  • list.index( a ) 이용해서 리스트 값 ( a )의 인덱스 값을 반환
  • list.clear() 이용해서 리스트에 저장된 모든 값 삭제
  • list.extend (  list2  ) 이용해서 리스트를 다른 리스트 list2에 연결 (매개변수가 무조건 리스트여야 함.)
list = [1, 2, 3, 4, 5]
print(len(list)) # 리스트 길이 구하기

list.append(6) # 값 추가 append
print(list) # [1, 2, 3, 4, 5, 6]

list.insert(0, 0) # 값 추가 insert(a,b) 인덱스 0 에 값 0 추가
print(list) # [0, 1, 2, 3, 4, 5, 6]

list2 = list + ["추가"] # + 연산자로 값 추가
print(list2) # [0, 1, 2, 3, 4, 5, 6, "추가"]

del(list[0]) # 함수 del : 특정위치 값 삭제
print(list) # [1, 2, 3, 4, 5, 6]

del(list[3:]) # 함수 del : 범위만큼 값 삭제 (인덱스 3 ~ 끝 삭제)
print(list) # [1, 2, 3]

list.remove(3) # remove 메서드 : 리스트 값 3 삭제
print(list) # [1, 2]

list. remove(100) # 만약 없는 값을 삭제하려 한다면 오류!!

리스트에 값이 들어있는지 확인하기

for 문을 이용해서 리스트를 전체 순환하면서 in 연산을 이용함 (True / False로 반환)

<묻는 값> in <물어볼 리스트명> 
#12라는 값이 리스트에 들어있는지 확인하는 코드
n=12
if n in list1:
    print('{}가 리스트에 있다.'.format(n))

리스트와 문자열

리스트와 문자열은 유사하고, 서로 변환이 가능하다.

  • 문자열 -> 리스트 : <자른 문자들을 담을 리스트명> = str.split( <자르는 기준 문자> )
  • 리스트 -> 문자열 : <합칠 구분 문자>.join( <자른 문자들 리스트명> )
time_str = "10:35:27"
time_list = time_str.split(":")
print(time_list) # ['10', '35', '27']

return_str = ":".join(time_list)
print(return_str) # 10:35:27

'Python > 파이썬 기초' 카테고리의 다른 글

[Python] 리스트와 딕셔너리 비교  (0) 2023.02.19
[Python] 자료구조 2 - 딕셔너리, 튜플  (0) 2023.02.19
[Python] 자료형과 사용자 입력  (0) 2023.02.17
[Python] 함수  (0) 2023.02.17
[Python] 조건문  (0) 2023.02.16