-
TIL.4 list 함수 응용편TIL 2020. 10. 12. 23:19728x90
## 리스트의 요소 추가하기
# append: 요소 하나를 추가
# extend: 리스트를 연결하여 확장
# insert: 특정 인덱스에 요소 추가
b = []
b.append(10)
print(b)
:: [10]
a = [10, 20, 30]
a.append(500)
print(a)
:: [10, 20 30, 500]
## 여기서 주의점은 기존 a라는 리스트에 500이 추가되는 방식으로 리스틑가 "변경"되는것이지 새 리스트를 "생성"하는것은 아니다.
c = [10, 20, 30, 40]
c.append(50)
print(c)
:: [10, 20, 30, 40, 50]
print(len(c)) # len(c) == 5
c.append([60, 70])
print(c)
:: [10, 20, 30, 40, 50, [60, 70]]
print(len(c)) #len(c) == 6
## append로 리스트 안에 리스트를 넣을 수 있다.
## 2. extend // 리스트 끝에 다른 리스트를 연결하여 리스트를 확장함.
## append 와의 차이점이 여기서 발생
d = [10, 20, 30, 40]
d.extend([50, 60, 70]) # 소괄호, 대괄호 주의
::
# d = [10, 20, 30, 40, 50, 60, 70]
print(len(d)) #len(d) == 7
## 3. insert // 인덱스, 요소를 리스트의 특정 인덱스에 요소를 하나 추가함.
## 리스트 사이에 원하는 값을 추가할 수 있게 해줌.
## append, extend는 리스트 끝에 추가 된다는 점읻
e = [10, 20, 30]
e.insert(2, 500) # 인덱스 2번 자리에 500을 넣어주세요!
:: # e = [10, 20, 500, 30]
# insert(0, 요소): 리스트의 맨 처음에 요소를 추가
# insert(len(리스트), 요소): 리스트 끝에 요소를 추가
a = [10, 20, 30]
a.insert(1, [500, 600])
:: # a =[10, [500, 600], 20, 30]
# insert안에 리스트를 넣으면 append처럼 리스트 안에 리스트가 들어감.
b = [1, 2, 3]
b[1:3] = [4, 5, 6] # insert와 비슷 [1:3]
print(b)
::
[1, 4, 5, 6] #인덱스 1 ,2, 3 번을 4 , 5, 6 의 값으로 변경
# 인덱스 슬라이싱을 이용하여 요소를 덮어쓰는것도 가능하다.
## 리스트에서 요소 삭제하기
# pop: 마지막 요소 또는 특정 인덱스의 요소를 삭제 (몇번째인지)
# remove: 특정 값을 찾아서 삭제 (해당되는 값)
a = [1, 2, 3]
a.pop()
:: # [1, 2]
b = [1, 2, 3]
b.pop(1)
:: # [1, 3]
# pop(인덱스번호)를 넣어 선택적 삭제 가능
c = [1, 2, 3]
del c[1] #c의 1번 요소를 삭제해주세요라는 뜻
:: [1, 3]
## pop 대신 del 사용 가능
d = [10, 20, 30, 40, 30]
d.remove(30)
:: # [10, 20, 40, 30]
## 리스트 d에는 30이라는 값이 2개가 있지만, 가장 처음 찾은 인덱스(2번)만 삭제한다!! (2개 동시 삭제 X)
##리스트로 보는 2가지 구조
## 1. stack(스택) 구조
## 2. deque(큐) 구조
## 3. 강의 만으로는 이해가 되지 않으니 추후 질문할것.
위 사진 처럼 append, pop를 이용해 스택과 큐 구조를 만들 수 있다고 한다.
참고 | 리스트로 스택과 큐 만들기
지금까지 알아본 리스트의 메서드로 스택(stack)과 큐(queue)를 만들 수 있습니다. 다음과 같이 append와 pop을 호출하는 그림을 90도 돌리면 스택의 모습이 됩니다.
여기서 pop() 대신 pop(0)을 사용하면 큐가 됩니다.
물론 append(), pop(0)이 아닌 insert(0, 요소), pop()을 사용해서 추가/삭제 방향을 반대로 해도 큐가 됩니다.
파이썬에서 스택은 리스트를 그대로 활용해도 되지만, 큐는 좀 더 효율적으로 사용할 수 있도록 덱(deque, double ended queue)이라는 자료형을 제공합니다. 덱은 양쪽 끝에서 추가/삭제가 가능한 자료 구조입니다.
deque(반복가능한객체)
더보기>>> from collections import deque # collections 모듈에서 deque를 가져옴
>>> a = deque([10, 20, 30])
>>> a deque([10, 20, 30])
>>> a.append(500) # 덱의 오른쪽에 500 추가
>>> a deque([10, 20, 30, 500])
>>> a.popleft() # 덱의 왼쪽 요소 하나 삭제 10
>>> a deque([20, 30, 500])
deque의 append는 덱의 오른쪽에 요소를 추가하고, popleft는 덱의 왼쪽 요소를 삭제합니다. 반대로 appendleft는 덱의 왼쪽에 요소를 추가하고, pop으로 덱의 오른쪽 요소를 삭제할 수도 있습니다.
a = [10, 20, 30, 15, 20, 40]
a.index(20)
:: 1
## 20 이라는 특정 값의 인덱스 번호 "1"을 구함!
## 같은 값이 어려 개일 경우 처음 찾은 인덱스를 구함!
b = [10, 20, 30, 15, 20, 40]
print(a.count(20))
:: 2
# conut로 리스트의 특정 값의 개수(2)를 구함
c = [10, 20, 30, 15, 20, 40]
c.reverse()
:: # [40, 20, 15, 30, 20, 10]
# reverse로 리스트의 요소 ##순서를 반대로 뒤집음
d = [10, 20, 30, 15, 20, 40]
d.sort()
:: # [10, 15, 20, 20, 30, 40]
# sort로 리스트의 요소를 정렬할수 있다 (디폴트 : 오름차순)
## sort() 또는 sort(reverse=False) // 리스트의 값을 작은 순서대로 정렬(오름차순)
ex : 달리기, 마라톤 등 시간과 관련된 값을 정렬할때 좋음
## sort(reverse=True) // 리스트의 값을 큰 순서대로 정렬(내림차순)
ex : 시험성적 등 점수(?)와 관련된 값을 정렬할때 좋음
e = [1, 2, 3]
e.clear()
:: []
## clear() 리스트의 모든 요소 삭제
f = [1, 2, 3]
del f[:]
:: []
## clear 대신 del f[:]와 같이 시작, 끝 인덱스를 생략하여 리스트의 모든 요소 삭제.
g = [10, 20, 30] # 0 1 2
g[len(g):] = [500]
:: [10, 20, 30, 500]
# g[len(g):]은 시작 인덱스를 len(g)로 지정해 리스트의 마지막 인덱스보다 1이 더 큰 상태임 len(g) == 3
## g[len(g):] = [500] 이는 곧, g.append(500) 과 같은 의미
g[len(g):] = [500, 600]
:: [10, 20, 30, 500, 500, 600]
## 리스트 끝에 리스트를 연결하는 g.extend([500, 600]) 과 같은 의미
## 리스트를 할당하다와 복사하다의 의미는?
## 할당
a = [0, 0, 0, 0, 0]
b = a ## "a" 라는 리스트를 "b"에 할당 시켰다
## 할당하는 것으로 리스트가 2개가 되는 것이 아니라, 실제로는 리스트가 1개 이다.
## 하나의 리스트를 가지고 a 이다, b 이다. 라고 사용하는 것.
print(a is b) # True
## True : 변수 이름만 다를 뿐 a와 b는 같은 객체이다
b[2] = 99 ## 리스트 값 변경
## b의 인덱스 2번의 값을 99로 "변경"
print(a)
print(b)
::
## 둘다 [0, 0, 99, 0, 0] 출력
## 복사
c = [0, 0, 0, 0, 0]
d = c.copy()
## copy 라는 메서드를 이용해 c 리스트의 모든 요소를 d에 복사한다.
## 따라서 변수 2개 / 리스트 2개가 생성
print(c is d) # False
## c와 d를 is 연산자로 비교시 False가 나옴 즉, c, d 리스트는 서로 다른 객체임!
print(c == d) # True
## c와 d 복사된 요소가 현제 변경된 점이 없어 모두 0000으로 요소의 값이 모두 같기 때문에 True 나옴
## 둘 중 어느 "한 변수" 만의 요소를 변화시키면 False가 나옴
d[2] = 99 # d 리스트의 인덱스 2번 값을 99로 변경
print(c) :: ## [0, 0, 0, 0, 0] 출력
print(d) :: ## [0, 0, 99, 0, 0] 출력
## 반복문 for, while 을 이용해 리스트 요소 모두 출력하기.
## for 문
a = [38, 21, 53, 62, 19]
for i in a: # a 대신 [38, 21 ...] 리스트를 직접넣어도됌
print(i)
for index, value in enumerate(a):
print(index, value)
for f, g in enumerate(a):
print(f, g)
## enumerate() // 인덱스와 요소 함께 출력
## 여기서 index, value 자리에 임의의 값이 들어가도 됌
for index, value in enumerate(a):
print(index +1, value)
# 표시 형식을 인덱스 0이 아닌 1로 단순 표기만 바꾸는 방법이다(1번_방법)
for index, value in enumerate(a, start=1):
print(index, value)
## 위의 식보다 더 Python 스러운 방법!!
## for 인덱스, 요소 in enumerate(리스트, start=숫자) 로 표기 방벙을 바꿀수 있다 (2번_방법)
## while 문
a = [38, 21, 53, 62, 19]
i = 0
while i < len(a):
print(a[i])
i += 1
## i <= len(a): 를 해버리면 error 왜냐, len(a)== 5인데, a 리스트의 5번째 인덱스는 없기 때문 (0 ~ 4가 끝)
728x90'TIL' 카테고리의 다른 글
TIL. 5 list 함수 응용편_3 (0) 2020.10.13 TIL.4+0.5 list 함수 응용편_2 (0) 2020.10.12 TIL.3 turtle graphics(터틀 그래픽스)를 이용한 도형 그리기 (0) 2020.10.11 TIL .2 중첩루프를 사용한 (별출력) (0) 2020.10.10 TIL. 1 FizzBuzz 공배수 출력(공배수) (0) 2020.10.09