When will you grow up?

python_내장시퀀스타입 본문

02. Study/Algorithm

python_내장시퀀스타입

미카이 2019. 8. 28. 01:11

알고리즘 문제를 풀 때 자주 사용되는 내장시퀀스데이터타입에 대해서 알아보자.

 

python의 시퀀스(sequence) 데이터 타입은 다음과 같은 속성을 가진다.

- 맴버십(membership)연산 : in 키워드 이용

- 크기(size) 메소드 : len(seq)

- 슬라이싱(slicing) 속성 : seq[0:-1]

- 반복성(iterability) : 반복문에 있는 데이터 순회

파이썬에는 문자열, 튜플, 리스트, 바이트 배열, 바이트 등 5개의 내장 시퀀스 타입이 있다.

 

 

#list
bin_list = []
print(type(bin_list)) # class 'list'

 

#string
bin_str = ''
print(type(bin_str)) # class 'str'

 

#tuple
bin_tuple = ()
print(type(bin_tuple)) # class 'tuple'

 

#bytearray
bin_bytearray = bytearray(b"")
print(type(bin_bytearray)) # class 'bytearray'

 

# byte type
bin_bytes = bytes([])
print(type(bin_bytes)) # class 'type'

 

 

 

 

깊은 복사와 슬라이싱 연산

 

- 앞서 숫자는 불변(immutable) 객체 타입이라고 했는데 파이썬에서 튜플, 문자열, 바이트는 불변 객체 타입이며 리스트와 바이트는 가변 객체 타입이다. 일반적으로 불변 객체 타입은 개변 객체 타입보다 효율적이다. 여기서 효율적이라는 말은 복제나 비교를 위한 조작을 단순화할 수 있고 성능 개선에 도움이 된다. 하지만 변경 가능한 데이터를 많이 가지고 있는 경우에는 불변이 오히려 부적절한 경우도 있다.

 

- 파이썬의 모든 변수는 객체 참조(reference)로 객체를 복사할 때 신경써야한다.

ex)  x=y일때, x는 실제 y가 가리키는(주소)를 가리킨다. 따라서 깊은 복사(deep copy)의 개념을 이해하는게 중요

 

# list 깊은 복사 예

my_list = [1,2,3,4]

new_list = my_list[:]

new_list2 = list(new_list)

 

# set 깊은 복사 예

p_language = {'파이썬', '자바', '씨언어'}

a_people = p_language.copy()

a_people.discard('씨언어')

a_people.remove('파이썬')

print(a_people) # {'자바'}

print(p_language) # {'자바', '씨언어', '파이썬'}

 

# 딕셔너리(dict) 깊은 복사 예

my_dict = {'이름' : "미카이"}

new_dict = my_dict.copy()

 

# 기타 객체의 깊은 복사 시 copy 모듈 이용

import copy

my_obj = '객체'

new_obj = copy.copy(my_obj) # shallow copy

new_obj1 = copy.deepcopy(my_obj) # deep copy

 

 

- 파이썬 시퀀스 타입에서 슬라이싱 연산자의 구문형태

seq[시작], seq[시작:끝], seq[시작:끝:스텝]

 

 

- 파이썬은 불변의 str 타입을 사용하여 string을 표현한다.

  string은 일련의 문자이고 string과 representational이 있는데 보통 representational형식은 인터프리터에서 사용하고 보통 디버깅시 사용한다.

 

- 유니코드 문자열 (unicode string) : 전 세계 언어의 문자를 정의하기 위한 국제 표준 코드(공백, 특수문자, 수학 등 기호들도 포함)이며 파이썬3 부터 모든 문자열은 바이트가 아닌 유니코드이다.

ex)

u'공부 \u0020세상' # 공부  세상

 

- 문자열 메소드

join() - 리스트에 있는 모든 문자열을 하나의 단열 문자열로 결합

a = ['파', '이', '썬']

" ".join(a) # 파 이 썬

"-".join(a) # 파-이-썬

 

ljust(),rjust() - 문자열 맨 처음 부터 문자열을 포함한 길이 만큼 문자 fillchar를 채운다. (l은 왼쪽부터 r는 오른쪽부터)

name ='미카이'

name.ljust(10, '-') # '미카이-------'

name.rjust(10, '-') # '-------미카이'

 

format() - 문자열을 변수에 추가하거나 형식화하는 데 이용

"{0} {1}".format('hello', 'world') # 'hello world'

'전공: {what}, 나이: {age}'.format(what='컴공', age='20') # '전공: 컴공, 나이: 20'

'{} {}'.format('파이썬', '잘하고싶다') # '파이썬 잘하고싶다'

 

문자열 언패킹 - 언패킹은 컬렉션의 요소를 여러 변수에 나눠 담는 것을 의미하는데, 문자열 언패킹 연산자는 **이며, 이를 사용하면 함수로 전달하기에 적합한 키-값 딕셔너리가 생성

name = 'mekai'

number = 123

'{number}: {name}'.format(**locals()) # '123: mekai'   local 메소드를 이용하면 현재 스코프에 있는 지역 변수를 딕셔너리로 반환

 

split() 메소드 - A.split(t, n) 는 문자열 A에서 문자열 t를 기준으로 정수 n번만큼 분리한 문자열 리스트를 반환

name = '이제*나는-졸리*11'

fields = name.split('*') # ['이제', '나는-졸리', '11']

 

strip() 메소드 - A.strip(B)는 문자열 A 앞뒤의 문자열 B를 제거한다. 인자값(B)이 없으면 공백문자를 제거

name = '123 건강하다33'

name.strip('123') # '123건강하다33'

 

index(), find() 메소드 - 문자열 안에서 다른 문자열의 인덱스 위치를 찾는 메소드이다

A.index(sub, start, end)는 문자열 A에서 부분 문자열 sub의 위치를 반환하며, 실패하면 Value Error 예외 발생

A.find(sub, start, end)는 문자열 A에서 부분 문자열 sub의 인덱스 위치를 반환하며, 실패하면 -1 반환

name = '미카이'

name.find('카') # 1

name.find('루') # -1

name.index('이') # 2

 

count() 메소드 - A.count(sub, start, end)는 문자열 A에서 인덱스 start, end 범위 내의 부분 문자열 sub가 나온 횟수를 반환한다.

ab = 'aayour name is mekaii'

ab.count('a', 0, -1) # 4

ab.count('a') # 4

 

replace() 메소드 - A.replace(old, new, maxplace)는 문자열 A에서 문자열 old를 대체 문자열 new로 maxreplace만큼 변경한 문자열의 복사본 반환하며 maxreplace를 지정하지 않으면 모든 old를 new로 변경

name = '미카이'

name.replace('카', '루') # '미루이'

 

 

- 튜플(tuple)은 쉼표(,)로 구분된 값으로 이루어지는 불변 시퀀스 타입이고 쉼표 없이 값 하나만 넣으면 튜플이 생성되지 않는다.

bin_tuple = ()  # 튜플

bin_tuple = (1) # int형 변수가 생성된다

 

튜플 메소드에는 count(x) x 개수 반환, index(x) x인덱스 위치 반환 등이 있다.

 

튜플 언패킹(unpacking)은 모든 반복 가능한(iterable) 객체는 시퀀스 언패킹 연산자(*) 를 사용하여 언패킹할 수 있다. 

x, *y = (1,2,3,4,5)

print(x) # 1

print(y) # [2,3,4,5] - list

 

 

- 리스트(list)는 다른 언어에 있는 배열(array)과 유사한 객체이지만 크기를 동적으로 조정할 수 있고, 배열과 연결 리스트의 차이점을 아는 것은 중요하다[이 부분은 생각날때 비교해서 구현해볼 예정]

 

append(), pop(), remove(), index(), insert(), remove(), pop() 등 자주 사용할 수 있는 메소드이다.

a = [2, 3]

b = [1, a, 4] # [1, [2,3], 4]

b[1].append('로봇') # [1, [2,3,'로봇'], 4]

b.pop() # [1, [2,3'로봇']]

b.insert(1, '하이') # [1, '하이', [2,3,'로봇']]

b.remove('로봇') # [1, [2,3,'로봇']]

 

리스트 언패킹(list unpacking) - 튜플과 비슷하여 * 인수를 사용할 수도 있다.

def example_args(a, b, c):

    return a* b* c

L = [1,2,3]

example_args(*L) # 6

example_args(2,*L[1:]) # 12

 

리스트 컴프리헨션(list comprehension)은 반복문의 표현식이며 조건문을 포함할 수 있다.

[항목 for 항목 in 객체]

[표현식 for 항목 in 객체]

[표현식 for 항목 in 객체 if 조건문]

a = [x for x in range(10) if x%2==0] # [0,2,4,6,8]

b = [2**x for x in range(10)] # [1, 2, 4, 8, 16, 32, 64, 128, 256, 512]

 

% 리스트 컴프리헨션은 단순한 경우에만 사용하는 것이 좋으며 가독성을 위해서는 여러 줄을 표현식과 조건문으로 표현하는 것이 좋을 수 있다. 구글 파이썬 가이드라인 참고 (https://google.github.io/styleguide/pyguide.md)

 

 

- 비트와 비트 연산자

비트 연산자는 비트로 표현된 숫자를 조작하는 데 유용하다. ex) 1<<x

x = 4

1<<x # 16

x = 8

x & (x-1) # 0

 

 

- 문자열 순열(permutation)은 서로 다른 n개 중 r개를 골라 순서를 고려해 나열한 경우의 수

입력으로 들어오는 길이 n의 문자열에서 n개 문자를 모두 선택하는 경우를 살펴보자.

import itertools

 

def perm(s):

    if len(s) < 2:

        return s

    res = []

    for i, c in enumerate(s):

        for cc in perm(s[:i] + s[i+1]:)

            res.append(c + cc)

    return resimport itertools

def perm(s):
    if len(s) < 2:
        return s
    res = []
    for i, c in enumerate(s):
        for cc in perm(s[:i] + s[i+1:]):
            res.append(c + cc)
    return res
def perm2(s):
    res = itertools.permutations(s)
    return ["".join(i) for i in res]

val = '012'
print(perm(val)) # ['012', '021', '102', '120', '201', '210']
print(perm2(val))  # ['012', '021', '102', '120', '201', '210']

 

문자열은 위와 같이 처리하면 되고,

 

만약 list로 순서를 알고싶다면,

val = [1,2,3,4]
res = itertools.permutations(val)
for i in res:
    print(i) # tuple type형식으로 return 된다.

 

itertools 패키지를 이용하면 조합도 만들어 준다.

 

순열은 순서를 고려하여 나열하는 반면, 조합(combination)은 순열에서 순서를 고려하지 않는다.

 

import itertools
z = []
val = [1,2,3,4] 
res = itertools.combinations(val, 2) # 2개의 조합으로 수열 만들기
for i in res: 
    #print(i) # tuple type형식으로 return 된다.
    z.append(i)

 

refer : 파이썬 자료구조와 알고리즘

'02. Study > Algorithm' 카테고리의 다른 글

python_그래프 기초  (0) 2019.09.02
python_자료구조  (0) 2019.08.31
python_구조와 모듈  (0) 2019.08.29
python_(Set, Dictionary)  (0) 2019.08.28
python_숫자  (0) 2019.08.27
Comments