<개인공부>/[Python]

[python] 파이썬 리스트(list) 정리 및 예제 (2탄 응용편)

사용자 BlockDMask 2020. 10. 29. 00:30
반응형

안녕하세요. BlockDMask 입니다.
오늘은 지난시간에 이어서 파이썬 리스트에 대해서 작성해보려합니다.
혹시 리스트 기본편을 보고오지 않은 분들은 기본편을 보고 오셔도 좋을것 같습니다.
파이썬 리스트 정리 및 예제 1탄 기본편 [바로가기]

오늘 진행해볼것은 리스트를 자료구조 stack으로 이용하는 방법, 리스트에 특정 값이 있는지 확인 하는 방법, range 등을 이용해서 리스트를 생성하는 방법 그리고 리스트 중복 값 제거 까지 알아보려고 합니다.

<목차>
1. 리스트를 stack으로 사용
2. 리스트에 특정 값이 있는지 없는지 확인하기 (in, not in)
3. 리스트 내부에서 range 이용, 리스트 컴프리헨션
4. 리스트 중복 값 제거


1. 파이썬 리스트를 stack 자료구조로 사용해보기


지난시간에 [리스트 정리 및 예제 1탄 기본편]에서 우리는 리스트의 다양한 함수들을 배웠습니다. 그 리스트 함수(메서드)를 이용해서 자료구조 stack으로 사용하는 방법에 대해서 알아보려고 합니다.

> 리스트를 stack으로 사용해보기

스택이라는 자료구조는 LIFO 구조로 last in, first out 이라 불립니다. 마지막에 들어온 값이 제일 먼저 나간다. 어떻게 보면 불합리한 구조 인거죠. 맨 마지막 놈이 제일 먼저 나가다니 ㅂㄷㅂㄷ.
하지만 우린 일상생활에서 이런 stack 구조를 많이 볼 수 있습니다. 한가지 예를 들면
우리 엘리베이터 많이들 타시죠? 제일 먼저 타면 제일 안쪽 구석탱이에 안전하게 갈 수 있지만, 그만큼 앞사람들이 다 내려야 내릴수 있죠?
반면 맨 마지막에 아슬아슬하게 탄 사람은 문이 열리자 마자 바로 나갈수 있습니다.
그리고 그 마지막에 탄 사람이 내려야 그 다음 번 마지막에 탄 사람이 내리고 그렇게 늦게 탄 사람들이 다 내려야 제일 먼저 타서 구석에 있던 내가 내릴수 있죠.
이게 Last in, First out. 마지막에 들어온게 제일 빨리 나간다. 하는 스택 구조라 할 수 있습니다.

이러한 stack 구조를 우리는 list의 append 함수와 pop 함수를 이용해서 쉽게 사용할 수 있습니다.
잠시. 복습을 하자면 
append(x) 함수는 리스트의 맨 마지막에 x 값을 추가해주는 함수이고,
pop() 함수는 리스트의 맨 마지막에 값을 반환하고, 리스트에서 그 값을 제거해주는 함수 입니다.

바로 예제로 확인하시죠.

1
2
3
4
5
6
7
8
9
10
11
12
= ['b''l''o']
print(a)
 
a.append(10)
print(a)
 
a.pop()
print(a)
 
a.pop()
print(a)
 
cs

이렇게 append 를 스택의 push 처럼 사용할 수 있고,
pop 함수를 이용해서 스택의 pop과 동일하게 사용할 수 있습니다.
어??
근데 저렇게 리스트 자체에서 쓰다보면 다른 리스트의 메서드들을 사용할 수 있겠죠?

append와 pop만 사용해야하는데, insert(a, b)를 이용해서 중간에 갑자기 값을 추가하거나 한다면 stack 자료구조가 어긋나게 되겠죠? 이런걸 방지하기 위해서 우리는 list를 우리가 직접 클래스로 감싸서 만들어서 사용하면 좋지 않을까 하는 생각이 자연스럽게 들게 됩니다. 그쵸? 그럼 만들어 볼까요?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class MyStack:
    def __init__(self):
        self.my_list = list()
 
    def push(self, x):
        self.my_list.append(x)
 
    def pop(self):
        return self.my_list.pop()
 
    def print(self):
        print(self.my_list)
 
 
= MyStack()
a.print()
 
a.push('BlockDMask')
a.print()
 
a.push(100)
a.print()
 
a.push(200)
a.print()
 
a.pop()
a.print()
 
cs

이렇게 리스트의 append 함수와 pop 함수만 사용하도록 MyStack 클래스에 push 함수와 pop 함수만 제공함으로써 stack 자료구조를 간단하게 구현할 수 있습니다. 간단하죠?


2. 파이썬 리스트 특정 값 확인 (in, not in)


리스트에서 x 값이 있는지 없는지 확인하기 위해서 우리는 in, not in 연산자를 사용합니다. 
in과 not in의 모양은 이렇습니다.
(확인할 값) in (리스트)
(확인할 값) not in (리스트)

in 의 결과 : 확인할 값이 리스트 내부에 들어있으면 true를 반환하고 없으면 false를 반환합니다.
반대로 not in의 결과 : 확인할 값이 리스트 내부에 들어있지 않을때 true, 값이 있을때 false를 반환합니다. 예제로 바로 확인해 보시죠.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 리스트 내부 특정값이 있는지 확인
= ['b''l''o''c''k''d''m''a''s''k']
 
# true false 반환 확인
print(f"'a' in s : {'a' in s}")
print(f"'z' in s : {'z' in s}")
print(f"'a' not in s : {'a' not in s}")
print(f"'z' not in s : {'z' not in s}")
 
# if 문에 사용
if 'a' in s:
    print('...1')
else:
    print('...2')
 
cs

이렇게 리스트 내부에 특정값, 특정요소가 있는지 확인하기 위해서는 in과 not in을 사용하면 되고, 그 결과값이 True False로 나오기 때문에 여러 부분에서 응용할 수 있습니다. 예제에서는 if 문에서 사용해 보았습니다.


3. 파이썬 리스트 생성 range 이용 (컴프리헨션)


우리는 리스트를 이때까지 손으로 일일히 하나하나 값들을 [ ] 대괄호 안에 집어 넣어서 만들기만 했습니다.
하지만 그 리스트가 일정한 규칙이 존재하는 리스트 인 경우 우리는 특정 함수를 이용해서 리스트를 생성할 수 있습니다.

바로 range 함수 인데요.
예전 제 포스팅 for 반복문 할때 잠시 나왔던 함수 인데요.
이 range 함수를 간단하게 설명하고 넘어가면, range(a, b) 라는 모양을 가지고 있고 a부터 b-1 까지의 숫자들들 하나하나 가지고 와주는 함수 입니다.
이걸 for 반복문과 사용하게 되면
for x in range(0, 10):
    print(x)

이렇게 됩니다. 이것은 x가 0부터 9까지 출력되는 함수 입니다.

우리는 이 for x in range(0, 10)을 이용해서 파이썬 리스트에 값을 넣어줄 수 있는데요. 짝수로 예를 들어볼까요?

1
2
3
4
5
6
7
8
= list()
 
for x in range(010):
    if x % 2 == 0:
        a.append(x)
 
print(a)
 
cs

이렇게 range를 이용해서 리스트를 만들어 줄 수 있습니다.
for 와 range를 이용해서 0~9까지 숫자를 돌면서 x에 넣어서 x가 2로 나누었을때 나머지가 없을때만, 리스트 a에 넣어줄 수 있습니다.
그러면 리스트에는 [0, 2, 4, 6, 8]이 들어가게 되어 이렇게 짝수 리스트를 얻을 수 있습니다.

그런데말입니다.
이렇게 규칙이 있는걸 간단하게 리스트로 만들어 줄 수 있는 파이썬의 신기한 문법이 존재합니다.
그런걸 컴프리헨션이라 하는데 리스트 자료형에서 쓴다고 해서 리스트 컴프리헨션(comprehension)이라 합니다.
물론 다른 자료형 집합, 딕셔너리에서도 사용될 수 있습니다.

리스트 컴프리헨션이라는 문법을 사용하면 위에있는 for문부터 append까지인 코드 라인 3줄로 이루어진 코드를 한줄로 끝낼 수 있습니다.

1
2
3
= [x for x in range(010if x % 2 == 0]
 
print(a)
cs

이렇게 말이죠.
"[x for x in range(0, 10)]" 까지는
x 값을 리스트에 넣을건데 그 x는 for문에 의해 생성될거고 그 for문의 범위는 range(0,10)까지의 값이다.

근데 그 값들 중에 if x % 2 == 0 의 조건을 만족하는 값들만 리스트에 넣을게.
이런 뜻입니다.

만약에 뒤에 조건문이 없이
a = [x for x in range(0, 10)] 이라면, 리스트 a에는 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]의 값으로 이루어진 리스트가 될 것 입니다.

더 자세한 리스트 컴프리 헨션은 추후 제가 다른 포스팅에서 다루거나, 구글링을 통해서 학습하시면 좋을듯 합니다. 키워드를 알아야 학습을 하니, "파이썬 컴프리헨션" 또는 "리스트 컴프리헨션"이라 검색하면 좋은 자료들이 많을 것 입니다.


4. 파이썬 리스트 중복 값 제거 방법


리스트 [1, 2, 3, 4, 5, 1, 2, 3, 1, 2, 7, 8, 9] 이런 리스트가 존재한다고 하면, 우리는 이 안에 있는 중복된 값들을 지우고 싶을때가 있습니다.

이럴때는 set 을 이용해서 간단하게 해결할 수 있습니다.
set 데이터 타입의 특징은 간단히 두가지로 요약할 수 있는데
1) 값들의 중복이 불가능하다.
2) 값들의 순서가 없다.

우린 이 첫번째 특징인 "값들이 중복이 불가능하다"라는 특징을 이용해서 리스트의 중복을 제거해보려 합니다. 바로 예제를 확인하시죠

1
2
3
4
5
6
7
8
9
= ['a''c''c''a'443211256777]
print(a)
 
= set(a)
print(b)
 
= list(b)
print(a)
 
cs

이렇게 중복을 제거했지만 set 데이터 타입의 두번째 특징인 "값들의 순서가 없다" 라는 것 때문에 list로 다시 돌아왔을때는 순서가 유지되는것을 보장 못하는것이 단점이라 하면 단점이라 할 수 있습니다.
순서가 일정하게 유지되어야한다면 이 방법이 단점일 수 있을것 같고,
그거 상관없이 다시 정렬 해도 괜찮은 상황이라면 리스트의 sort 메서드를 이용해서 리스트를 다시 정렬해도 좋을것 같습니다.


이상으로 파이썬 리스트 자료형 응용 포스팅을 마치겠습니다.
도움이 되었나요?
감사합니다.

반응형