TIL

TIL.4 list 함수 응용편

codermun 2020. 10. 12. 23:19
728x90
반응형

## 리스트의 요소 추가하기

# append: 요소 하나를 추가

# extend: 리스트를 연결하여 확장

# insert: 특정 인덱스에 요소 추가

b = []

b.append(10)

print(b)

:: [10]


a = [102030]

a.append(500)

 

print(a)

:: [10, 20 30, 500]

 

## 여기서 주의점은 기존 a라는 리스트에 500이 추가되는 방식으로 리스틑가 "변경"되는것이지 새 리스트를 "생성"하는것은 아니다.


c = [10203040]

 

c.append(50)

print(c)

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

 

print(len(c)) # len(c) == 5

 

c.append([6070])

print(c)

:: [10, 20, 30, 40, 50, [60, 70]]

 

print(len(c)) #len(c) == 6

 

## append로 리스트 안에 리스트를 넣을 수 있다. 





## 2. extend // 리스트 끝에 다른 리스트를 연결하여 리스트를 확장함.

## append 와의 차이점이 여기서 발생

 

d = [10203040]

 

d.extend([506070]) # 소괄호, 대괄호 주의

::

# d = [10, 20, 30, 40, 50, 60, 70]

 

print(len(d)) #len(d) == 7 

 

## 3. insert // 인덱스, 요소를 리스트의 특정 인덱스에 요소를 하나 추가함.

## 리스트 사이에 원하는 값을 추가할 수 있게 해줌.

## append, extend는 리스트 끝에 추가 된다는 점읻   


e = [102030]

 

e.insert(2500# 인덱스 2번 자리에 500을 넣어주세요!

 

::  # e = [10, 20, 500, 30]

 

# insert(0, 요소): 리스트의 맨 처음에 요소를 추가

# insert(len(리스트), 요소): 리스트 끝에 요소를 추가


a = [102030]

a.insert(1, [500600])

:: # a =[10, [500, 600], 20, 30]

 

# insert안에 리스트를 넣으면 append처럼 리스트 안에 리스트가 들어감.


b = [123]

b[1:3] = [456# insert와 비슷 [1:3]

print(b)

::

[1, 4, 5, 6] #인덱스 1 ,2, 3 번을 4 , 5, 6 의 값으로 변경

# 인덱스 슬라이싱을 이용하여 요소를 덮어쓰는것도 가능하다.


## 리스트에서 요소 삭제하기

 

pop: 마지막 요소 또는 특정 인덱스의 요소를 삭제 (몇번째인지)

remove: 특정 값을 찾아서 삭제 (해당되는 값)

 

a = [123]

a.pop()

:: # [1, 2]

 

b = [123]

b.pop(1)

:: #  [1, 3]

 

# pop(인덱스번호)를 넣어 선택적 삭제 가능

 

c = [123]

del c[1#c의 1번 요소를 삭제해주세요라는 뜻

:: [1, 3]

 

## pop 대신 del 사용 가능


d = [1020304030]

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 = [102030152040]

a.index(20)

:: 1

 

## 20 이라는 특정 값의 인덱스 번호 "1"을 구함!

## 같은 값이 어려 개일 경우 처음 찾은 인덱스를 구함! 


b = [102030152040]

 

print(a.count(20))

:: 2

 

# conut로 리스트의 특정 값의 개수(2)를 구함


c = [102030152040]

 

c.reverse()

 

:: # [40, 20, 15, 30, 20, 10]

 

# reverse로 리스트의 요소 ##순서를 반대로 뒤집음


d = [102030152040]

d.sort()

 

:: # [10, 15, 20, 20, 30, 40]

 

# sort로 리스트의 요소를 정렬할수 있다 (디폴트 : 오름차순)

## sort() 또는 sort(reverse=False) // 리스트의 값을 작은 순서대로 정렬(오름차순) 

ex : 달리기, 마라톤 등 시간과 관련된 값을 정렬할때 좋음

## sort(reverse=True) // 리스트의 값을 큰 순서대로 정렬(내림차순)

 ex : 시험성적 등 점수(?)와 관련된 값을 정렬할때 좋음


e = [123]

 

e.clear()

:: []

 

## clear() 리스트의 모든 요소 삭제

 

f = [123]

del f[:]

:: []

 

## clear 대신 del f[:]와 같이 시작, 끝 인덱스를 생략하여 리스트의 모든 요소 삭제.


g = [102030# 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):] = [500600

:: [10, 20, 30, 500, 500, 600]

 

## 리스트 끝에 리스트를 연결하는 g.extend([500, 600]) 과 같은 의미


## 리스트를 할당하다와 복사하다의 의미는?

 

## 할당

 

a = [00000]

 

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 = [00000]

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 = [3821536219]

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 = [3821536219]

i = 0

 

while i < len(a):

    print(a[i])

    i += 1

 

## i <= len(a): 를 해버리면 error 왜냐, len(a)== 5인데, a 리스트의 5번째 인덱스는 없기 때문 (0 ~ 4가 끝)




728x90
반응형