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
'Python > Basic' 카테고리의 다른 글
[파이썬, Python] 부동 소수점(floating point number) - 실수의 연산, 부동 소수점 오차, 실수의 비교 (0) | 2023.03.07 |
---|---|
[파이썬, Python] 자료구조(Data Structure) - 2️⃣튜플(tuple) (0) | 2023.03.07 |
[파이썬, Python] 문자열(string) 다루기 - 문자열 함수, 문자열 인덱싱, 슬라이싱 (0) | 2023.03.06 |
[파이썬, Python] 입력함수 input()에 대해 알아보자 🧐 (0) | 2023.03.06 |
[파이썬, Python] 변수란? & 변수의 데이터 타입 & 변수 삭제하기 (0) | 2023.03.06 |