본문 바로가기
Python/파이썬 기초

시퀀스형(리스트, 튜플, 레인지)과 관련 함수/메서드 - 파이썬 기초(4)

by 콩돌 2018. 11. 11.
반응형

참고 자료

https://docs.python.org/3/library/stdtypes.html



파이썬 버전 3.7 기준



파이썬 자료형 및 연산자(3)


시퀀스형


시퀀스형의 자료형은 무언가의 조합으로 이루어진 자료형이라고 생각하면 편하다.

시퀀스형에는 3가지의 기본 시퀀스형(리스트, 튜플, 레인지)이 있다. 

바이너리 데이터 및 텍스트 문자열 처리를 위한 시퀀스형들 역시 존재한다.


리스트(list)


  ○ 리스트는 가변 시퀀스형이다.

  ○ 일반적으로 유사한 항목의 모음을 저장하는데 사용된다.(유사도는 프로그램마다 다름)

  ○ 리스트의 생성은 다양한 방법을 통해 가능하다.

    ▷ 대괄호를 통해 빈 리스트 생성: []

    ▷ 대괄호 안에 값을 입력하여 생성(쉼표 이용 여러 값 입력가능): ['a'], ['a', 'b', 'c']

    ▷ 리스트 컴프리헨션 이용: [x for x in range(0,20)]

    ▷ 형 생성자 이용: list(), list((1,2,3, ... ))


  ○ list.sort(*, key=None, reverse=False)

    ▷ < 비교만 사용하여 리스트를 제자리에서 정렬한다.

    ▷ 비교연산이 실패할 경우 전체 정렬연산이 실패한다. (부분적으로 수정된 상태로 남음)

    ▷ 큰 시퀀스를 정렬할때 메모리를 절약하기 위해 제자리에서 수정한다.

    ▷ 안정적이기 때문에 여러 번 정렬하는 것이 가능하다.

    ▷ reverse를 True로 할 경우 값이 큰 순으로 정렬한다.



튜플(tuple)


  ○ 튜플은 불변 시퀀스형이다.

  ○ 보통 서로다른 데이터를 저장할때 사용한다.(예: enumerate()함수로 생성된 2-튜플)

  ○ 같은 형태의 데이터의 불변 시퀀스가 필요할 경우 종종 사용한다.

      (예: set이나 dict인스턴스에 저장하고자 하는 경우)

  ○ 튜플 생성은 다양한 방법을 통해 가능하다.

    ▷ 소괄호를 통해 빈 리스트 생성: ()

    ▷ 단일 항목 튜플을 위해 마지막에 쉼표 붙이기: a, 또는 (a,)

    ▷ 항목을 쉼표로 구분: a, b, c 또는 ''(a, b, c)''

    ▷ 형 생성자 이용: tuple() 또는 tuple((1,2,3, ... ))


    ※ 실제로 튜플을 만드는건 괄호가 아니라 쉼표라는 사실을 명심하도록 한다.

       괄호는 문법상 모호함을 피하기 위함이다.



레인지(range)


  ○ 숫자의 불변시퀀스를 나타낸다.

  ○ for루프에서 특정 횟수만큼 반복하는데 자주 사용한다.

  ○ range를 생성할 때의 형태이다.

    ▷ range(stop): 0부터 stop 전 까지 생성한다.

    ▷ range(start, stop): start부터 stop 전 까지 1씩 증가시켜가며 생성한다.

    ▷ range(start, stop, step): start부터 stop 전 까지 step 만큼 증가시켜가며 생성한다.

        (start의 기본값은 0이며, step의 기본값은 1이다.)

  ○ 표현범위크기와 무관하게 리스트나 튜플보다 메모리 사용이 적다.

      (start, stop, step만 저장한다.)

  ○ ==나 !=로 검사할 경우 시퀀스처럼 비교하게 됨. 즉, 범위가 나타내는 값이 같으면 같다고 취급한다. 

     (예: range(0, 5, 2) == range(0, 6, 2)는 True를 출력한다.)



공통 시퀀스 연산


연산자

사용 예

의미

비고

in

x in s

시퀀스 s의 항목중 하나가 x와 같으면 True 

아니면 False을 출력한다.


not in

x not in s

 시퀀스 s의 항목중 하나가 x와 같으면 False

아니면 True를 출력한다.

+

s + t

시퀀스 s에 시퀀스 t를 이어붙인다. 

 

*

s * n

n * s

 시퀀스 s를 n-1번 이어붙인다.

(총 n개의 s가 형성된다.)

s[i]

 s[i]

시퀀스 s의 i번째 요소(0부터 시작)을 출력한다.


s[i:j]

 s[i:j]

시퀀스 s의 i번째 요소부터 j-1번째 요소까지 

출력한다. (i부터 j까지의 슬라이스)


s[i:j:k]

 s[i:j:k]

시퀀스 s의 i번째 요소부터 j-1번째 요소까지 

k스탭으로 출력한다. 


len()

len(s)

시퀀스 s의 길이를 출력한다.

 

min()

 min(s)

시퀀스 s 요소 중 가장 작은 값을 출력한다.

 

max()

max(s)

시퀀스 s 요소 중 가장 큰 값을 출력한다.

 

index()

s.index(x,[i [, j]])

시퀀스 s에서 첫번째로 등장하는 x의 인덱스를 출력한다.

(i, j는 요소 인덱스의 범위를 나타냄)

count()

 s.count(x)

시퀀스 s에서 x가 등장하는 총 수를 출력한다.

 


※ in과 not in은 단순하게 포함된 요소의 존재유무를 검사하지만 몇몇 특수한 시퀀스(예: str, bytes, bytearray)에서는 서브 시퀀스 검사에 사용하기도 한다.
In[2]: 'ko' in 'korea'
Out[2]: True

※ 빈 시퀀스를 n번 더하는 경우 같은 레퍼런스를 참조하게 되므로 주의해야한다.
in[2]: list = [[]] * 5
in[3]: list[0].append(5)
in[4]: list
Out[4]: [[5], [5], [5], [5], [5]]

※ s[i]에서 i 값은 음수 사용이 가능하며, 음수를 사용할 경우 시퀀스의 끝 데이터부터 출력한다. 
   하지만 -0은 여전히 0이므로 주의하라.
   s[i:j]나 s[i:j:k]에서도 마찬가지로 음수 사용이 가능하다.
In[51]: list = [1,2,3,4,5]
In[52]: list[-1]
Out[52]: 5
In[53]: list[-2]
Out[53]: 4
In[54]: list[-0]
Out[54]: 1
In[55]: list[-3:-1]
Out[55]: [3, 4]
In[56]: list[-3:-1:1]
Out[56]: [3, 4]


※ s.index(x)에서 x가 없을 경우 에러가 발생하다.


※※※※


가변 시퀀스 연산 (리스트)


연산자

사용 예

의미

비고

=

s[i] = x 
s[i:j] = x
s[i:j:k] = t

s의 i번째 요소를 x로 대체한다.
s의 i번째부터 j-1번째까지의 요소를 x로 대체한다.
s[i:j:k]의 항목들이 t의 항목으로 대체한다.

del

del s[i:j]


del s[i:j:k]

s의 i번째요소부터 j-1번째까지의 요소를 삭제한다.
s[i:j]  = []도 같은 결과를 나타낸다.

s[i:j:k]의 항목을 제거한다.


append()

s.append(x)

s에 가장 끝에 x를 추가한다.

s[len(s):len(s)] = [x]도 같은 결과를 나타낸다.

 

clear()

s.clear()

s에서 모든 항목을 제거한다.

del s[:]도 같은 결과를 나타낸다.

 extend()

s.extend(t)

또는 s += t

t의 내용으로 s를 확장한다.

s[len(s):] = t 도 같은 결과를 나타낸다.

 

*=

s *= n

내용이 n번 반복되도록 s를 갱신한다.

insert()

s.insert(i, x)

x를 s의 i로 주어진 인덱스에 삽입한다.
s[i:i] = [x] 도 같은 결과를 나타낸다.

 

copy()

s.copy() 

s의 앝은 복사를 나타낸다.
s[:]도 같은 결과를 나타낸다.

pop()

s.pop([i])

 s에서 i에 있는 항목을 꺼네고 그 항목을 제거한다.

remove()

s.remove(x)

s에서 첫번째로 등장하는 x를 제거한다.

reverse()

s.reverse() 

제자리에서 s의 요소의 순서를 뒤집는다.


※ s[i:j:k]에서 t는 교체할 슬라이스와의 길이가 같아야 한다.

※ pop([i])의 경우 i의 기본값이 -1이므로 가장 끝의 요소를 꺼내고 삭제하고 싶을 경우 i입력을 생략 가능하다.

※ remove(x)의 경우 x가 존재하지 않는 경우 에러를 발생시킨다.

※ reverse()의 경우 제자리에서 순서를 뒤집으므로 메모리가 적게들지만 이전 순서데이터는 보존하지 못한다.

※ s *= n에서 n이 음수거나 0이면 시퀀스를 지우며 n값은 정수여야 한다.

※ copy()와 clear()는 슬라이싱 연산을 지원하지 않는 경우에도 사용이 가능하다.

   (즉, dict, set에서도 사용가능하다.)


※※※※



반응형

댓글