본문 바로가기
Python/Basic

[파이썬, Python] 자료구조(Data Structure) - 1️⃣ 리스트(list)

by coding-choonsik 2023. 3. 6.
728x90
반응형
SMALL

1. 자료구조(Data Structure)란 ❓

  • 코드상에서 데이터를 효율적으로 처리하기 위해 데이터 특징에 따라 체계적으로 구조화하여 저장하는 방식

2. 리스트(list) 

  • <class 'list'>
  • 여러가지 데이터 및 데이터타입을 콤마(,)로 구분하여 대괄호([ ]) 로 감싼 구조
  • 원소들이 연속적으로 저장되는 형태의 자료형
  • 저장되는 요소들이 모두 같은 자료형일 필요는 없다.
li1 = [1, 3, 5, 7, 9]

print(li1)
print(type(li1))

>>> [1, 3, 5, 7, 9]
<class 'list'>
li2 = list(1,3,5,7,9)
print(li2)

>>> 
TypeError: list expected at most 1 argument, got 5  # 여러 요소를 list 구조로 저장할 땐 대괄호로 묶어주어야 한다.


li2 = list([1,3,5,7,9])
print(li2)

>>> [1, 3, 5, 7, 9]

 

✔ 스칼라 구조(scalar)

  • 데이터의 요소가 1개로 이루어진 자료구조
a = 10
print(a)

>>> 10

파이썬 변수의 메모리 할당


문자열을 list 로 저장해보자.

li3 = ['김사과', '반하나','오렌지','이메론']
print(li3)

>>> ['김사과', '반하나', '오렌지', '이메론']

여러 데이터 타입의 데이터를 하나의 list 구조로 저장해보자.

li4 = ['김사과', 1, 50.5, True]
print(li4)

>>> ['김사과', 1, 50.5, True]


데이터를 다차원의 list구조로 저장해보자.

li5 = [1, 2, '파이썬',['김사과','오렌지']]
print(li5)

>>> [1, 2, '파이썬', ['김사과', '오렌지']]

 

3. 리스트의 인덱싱(Indexing)

  • 인덱싱의 경우 차원이 1차원씩 감소
li1 = [1, 3, 5, 7, 9]

print(li1)
>>> [1, 3, 5, 7, 9]

print(li1[0])  
>>> 1    # 하나의 요소가 아니라 스칼라값임 ->  차원 감소

print(li1[-1])
>>> 9

print(li1[0] + li1[-1])  
>>> 10   # int형 끼리 연산 가능
li2 = ['김사과', '오렌지', '반하나', ['🍔','🍕','🥞','🧀']]

print(li2[0])
>>> 김사과 

print(li2[-1])
>>> ['🍔', '🍕', '🥞', '🧀']   # 2차원의 list 구조에서 1차원의 list구조로 감소

print(li2[-1][-2]) 
>>> 🥞     # ['🍔', '🍕', '🥞', '🧀'] 에서 뒤에서 두번째 인덱스
li3 = [1, 2, 3,['김사과', '오렌지', '반하나', ['🍔','🍕','🥞','🧀']]]

print(li3[2])
>>> 3

print(li3[-2])
>>> 3

print(li3[-1])
>>> ['김사과', '오렌지', '반하나', ['🍔', '🍕', '🥞', '🧀']]

print(li3[-1][-2])
>>> 반하나

print(li3[-1][-1][-1])
>>> 🧀

4. 리스트 슬라이싱(Slicing)

  • 슬라이싱은 차원이 유지됨
li4 = [10, 20, 30, 40, 50]

print(li4)
>>> [10, 20, 30, 40, 50]

print(li4[0:3])  
>>> [10, 20, 30]  # 0부터 3이 되기 직전까지(인덱스0~2까지)
li5 = li4
print(li5)

>>> [10, 20, 30, 40, 50] 

li5[0] = 100   
print(li5)
print(li4)

>>> [100, 20, 30, 40, 50]    # li4와 li5가 같은 주소를 가리키고 있기 때문에 같이 바뀜
>>> [100, 20, 30, 40, 50]

아래 그림을 보면 좀 더 이해하기 쉽다.

 

li6 = [10, 20, 30, ['김사과','오렌지','반하나'], 40, ['🍕','🍔']]

print(li6[2:6])      # 인덱스 2부터 6이되기 직전까지(2~5)
>>> [30, ['김사과', '오렌지', '반하나'], 40, ['🍕', '🍔']]    # list의 차원이 유지

print(li6[5][:1])    # 인덱스 5번['🍕','🍔']에서 1이 되기 직전까지
>>> ['🍕']

5. 리스트 연산자

  • 리스트에서 + 연산자는 리스트끼리의 덧셈연산이 아닌 리스트의 결합이다.
  • 리스트 연산에서 - 연산은 지원하지 않는다.
  • 리스트와 일반 상수의 곱 연산은 리스트의 반복이다.
li7 = [10, 20, 30]
li8 = [40, 50, 60]

print(li7 + li8)  # +연산은 list 끼리 결합
>>> [10, 20, 30, 40, 50, 60]

print(li8 + li7)
>>> [40, 50, 60, 10, 20, 30]

print(li7 - li8)  
>>> TypeError: unsupported operand type(s) for -: 'list' and 'list'
print(li7 * li8)
>>> # TypeError: can't multiply sequence by non-int of type 'list' 

print(li7 * 3)   
>>> [10, 20, 30, 10, 20, 30, 10, 20, 30]    # 리스트와 일반 상수의 곱 연산은 반복

6. 리스트의 수정 및 삭제 

6-1. 리스트 내 요소 수정하기

li10 = [10, 20, 30]
li10[1] = 100

print(li10)

>>> [10, 100, 30]

6-2. 리스트에 데이터 추가하기

1) 슬라이싱을 이용하여 리스트에 데이터를 추가해보자.

li10[1:2] = ['😋','😁','😉']    # li10[1:2] : 1번째 인덱스
print(li10)

>>> [10, '😋', '😁', '😉', 30]

리스트에 데이터만 추가됨을 알 수 있다.  (list의 차원유지)

 


2) 인덱싱을 이용하여 리스트에 데이터를 추가해보자.

li10[1] = ['😋','😁','😉']
print(li10)

>>> [10, ['😋', '😁', '😉'], '😁', '😉', 30]  # 1번째 인덱스에 데이터 리스트 추가

리스트에 리스트가 추가됨을 알 수 있다. (list의 차원 증가)


6-3. 리스트에서 데이터 삭제하기

1) 리스트 내 특정 데이터 삭제하기

li10 = [10, ['😋', '😁', '😉'], '😁', '😉', 30]
print(li10[1:3])

>>> [['😋', '😁', '😉'], '😁']

# 빈 리스트를 저장하면 요소가 삭제됨
li10[1:3] = []
print(li10)

>>> [10, '😉', 30]


del li10[0]  # 인덱스 0번 요소 삭제
print(li10)

>>> ['😉', 30]

2)  리스트 전체 삭제하기

del li10
print(li10)

>>> NameError: name 'li10' is not defined

7. 리스트 함수

7-1. append()

  • 리스트의 요소 맨 마지막 자리에 데이터를 추가
  • 데이터를 2개 이상 추가 시킬 경우 대괄호로 감쌈
  • 리스트 그대로 추가됨(차원 증가)
li11 = [10, 20, 30]
print(li11)

>>> [10, 20, 30]

li11.append(100)
print(li11)

>>> [10, 20, 30, 100]

li11.append([200,300])
print(li11)

>>> [10, 20, 30, 100, [200, 300]]

 

7-2. extend()

  • 리스트에 요소를 추가
  • 하나의 데이터라도 무조건 대괄호로 감싸야함
  • 리스트에 데이터만 추가됨(차원 유지)
  • 재저장되는 inplace 연산
li11 = [10, 20, 30, 100, [200, 300]]

# li11.extend(50)    TypeError: 'int' object is not iterable

li11.extend([50])
print(li11)

>>> [10, 20, 30, 100, [200, 300], 50]


li11.extend([1000,3000])
print(li11)

>>>[10, 20, 30, 100, [200, 300], 50]
[10, 20, 30, 100, [200, 300], 50, 1000, 3000]  # 데이터만 추가, 차원 유지

✔ inplace 연산: 기존 변수에 연산한 결과를  다시 재저장 함.

  • inplace 연산자 : += , -=, *=, /= ...
li11 = [10, 20, 30]
li11 = li11 + [40, 50]  # li11 += [40, 50]
print(li11)

>>> [10, 20, 30, 40, 50]

7-3. pop()

  • 리스트에 맨 마지막에 저장된 데이터를 반환하고 데이터는 삭제
li12 = [10, 20, 30, 40, 50]

print(li12)
>>>[10, 20, 30, 40, 50]

print(li12.pop())
>>> 50

print(li12)
>>> [10, 20, 30, 40]

temp = li12.pop()
print(temp)
>>> 40   # 반환된 데이터를 temp변수에 저장

7-4. remove()

  • 매개변수로 전달된 데이터를 제거
  • 같은 데이터가 여러개 있는 경우 처음 출현하는 데이터만 제거
li13 = [10, 20, 30, 40, 50, 20, 40]
print(li13)

>>> [10, 20, 30, 40, 50, 20, 40]

li13.remove(20)
print(li13)

>>> [10, 30, 40, 50, 20, 40]  # 처음 출현한 20만 제거

li13.remove(20)
print(li13)
 
>>> [10, 30, 40, 50, 40]

li13.remove(20)  
print(li13)

>>> ValueError: list.remove(x): x not in list  # 지우려는 데이터가 없다면 에러!

7-5. insert()

  • 리스트의 특정 위치(인덱스)에 데이터를 삽입
li14 = [10, 20, 30]

li14.insert(1, 100)   # 1번째 인덱스에 100 이라는 데이터 삽입

>>>[10, 100, 20, 30]

7-6. index()

  • 리스트에 저장된 데이터가 있을 경우 위치를 인덱스로 반환
  • 데이터가 없으면 에러
li14 = [10, 100, 20, 30]

print(li14.index(100))
>>> 1


print(li14.index(40))
>>> ValueError: 40 is not in list

7-7. reverse()

  • 리스트에 저장된 데이터를 반대 순서로 반환
li15 = [100, 50, 70, 60, 20]

li15.reverse()
print(li15)

>>> [20, 60, 70, 50, 100]


li16 = ['김사과','오렌지','이메론','반하나']

li16.reverse()
print(li16)

>>> ['반하나', '이메론', '오렌지', '김사과']

7-8. sort()

  • 리스트에 저장된 데이터를 오름차순 또는 내림차순으로 정렬
  • inplace 연산을 수행
  • reverse=True : 내림차순
li17 = [10,40,30,100,90,50]

li17.sort()
print(li17)

>>> [10, 30, 40, 50, 90, 100]

li17.sort(reverse=True)
print(li17)

>>> [100, 90, 50, 40, 30, 10]

 

문자열 데이터도 정렬해보자.

li18 = ['Apple','apple','orange','banana','melon']

li18.sort()
print(li18)

>>> ['Apple', 'apple', 'banana', 'melon', 'orange']  # ascii코드 순


li19 = ['김사과','오렌지','이메론','반하나','배애리']
li19.sort()
print(li19) 

>>> ['김사과', '반하나', '배애리', '오렌지', '이메론']  # 가나다 순

 

아스키코드의 십진수는 다음 표와 같다.

 

✔ 비교하기 : sorted()

  • iterable 객체로부터 정렬된 리스트를 생성함
  • 표준 파이썬 함수
  • inplace 연산 수행하지 않음
li17 = [10,40,30,100,90,50]

print(sorted(li17)) 
print(sorted(li17, reverse=True))
print(li17)

>>> [10, 30, 40, 50, 90, 100]
[100, 90, 50, 40, 30, 10]
[10, 40, 30, 100, 90, 50]  # inplace 연산x

문자열 데이터도 정렬해보자.

li18 = ['Apple','apple','orange','banana','melon']

print(sorted(li18))
print(sorted(li18, reverse=True))
print(li18)

>>> ['Apple', 'apple', 'banana', 'melon', 'orange']
['orange', 'melon', 'banana', 'apple', 'Apple']
['Apple', 'apple', 'orange', 'banana', 'melon']  # inplace 연산 x

sotred() 함수로 정렬된 데이터를 저장하려면 변수에 다시 저장해주어야 한다.

li17 = sorted(li17, reverse=True)
print(li17)

>>> [100, 90, 50, 40, 30, 10]

7-9. count()

  • 리스트에 포함된 특정 데이터의 갯수를 반환
li18 = [10, 20, 30, 50, 20, 40, 30, 20]

print(li18.count(20))  
>>> 3

print(li18.count(0))   
>>> 0

➕ len()

  • 파이썬 표준함수
  • 리스트 요소의 갯수를 반환
li18 = [10, 20, 30, 50, 20, 40, 30, 20]

print(len(li18))

>>> 8

 

 

728x90
반응형
LIST