프로그래밍/Python

[Python] 자료형 특집 - (1) 시퀀스 타입(List/Tuple/Range)

Churnobyl 2023. 3. 24. 19:00
728x90
반응형

자료형 특집은 기본적인 부분은 최대한 배제하고 내가 몰랐던 부분 위주로 작성하려고 한다

 

시퀀스타입이란 값이 연속적으로 이어진 자료형이다

Python의 기본적인 시퀀스 타입(Sequence Type)은 세가지가 있다. List/Tuple/Range

(문자열 타입은 따로 정리해야 하므로 제외하도록 한다)

 

 


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

sequence안의 x가 (i번 index 이후, j번 index 이전에서) 첫번째로 발견되는 index(위치) 반환 

 

  • Optional Parameter
    • i : 찾을 인덱스의 시작. search범위에 포함
    • j: 찾을 인덱스의 끝. search범위에 미포함

아래의 예제를 보자

 

arr = [1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4]

# 1
print(arr.index(1))

# 2
print(arr.index(1, 3))

# 3
print(arr.index(1, 5, 9))

# 4
print(arr.index(1, 5, 8))
0
4
8
ValueError: 1 is not in list

 

# 1

리스트의 맨 처음 값이 1이므로 0번 index인 0을 리턴했다

 

# 2

3번 index(value: 4)이후부터 1을 찾아서 index를 리턴했다

 

# 3

5-9번 인덱스 사이에서 1을 찾아 index를 리턴했다

 

# 4

5-8번 인덱스 사이에는 1이 없으므로 ValueError를 리턴했다

 


del sequence[i : j] or [i : j : k]

시퀀스의 요소를 삭제한다.

 

  • del sequence는 해당 시퀀스를 전부 삭제한다
  • Optional Parameter
    • i : 인덱스의 시작
    • j: 인덱스의 끝. search범위에 미포함
    • k: step

아래 예제를 보자

# 1
arr = [1, 2, 3, 4]
del arr
print(arr)

# 2
arr = [1, 2, 3, 4]
del arr[1:3]
print(arr)

# 3
arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
del arr[0:10:2]
print(arr)
NameError: name 'arr' is not defined
[1, 4]
[2, 4, 6, 8, 10]

 

# 1

arr 자체가 삭제되어 NameError를 리턴했다

 

# 2

1번 인덱스부터 2번인덱스까지 삭제해 [1,4]가 리턴됐다

 

# 3

0번 인덱스부터 9번 인덱스까지 2 step마다 삭제해 짝수가 리턴됐다

 


sequence.clear()

시퀀스는 남긴채 시퀀스의 요소를 모두 비운다

 


아래 예제를 보자

# 1
arr = [1, 2, 3, 4]
arr.clear()
print(arr)
[]

 

# 1

arr 리스트의 요소가 모두 비워져 빈 리스트가 리턴됐다

 


sequence.copy()

시퀀스를 얕은 복사(Shallow Copy)한다

 

  • 얕은 복사(Shallow Copy) : 객체의 요소들을 복사하는 것이 아니라 객체의 참조(주소)만 복사하는 것
  • 깊은 복사(Deep Copy) : 객체의 주소 및 요소를 전부 복사해 새롭게 만들어 주는 것

아래 예제를 보자

import copy

arr = [1, 2, 3, 4, [5, 6, 7], 8]
print(f"arr 주소: {hex(id(arr))[-6:]}")
print(f"요소 리스트 주소: {hex(id(arr[4]))[-6:]}")

print()

# 1
arr2 = arr
print(f"결과: {arr2}, 주소: {hex(id(arr2))[-6:]}")
print(f"메모리 주소: {hex(id(arr2[4]))[-6:]}")

# 2
arr2 = arr[:]
print(f"결과: {arr2}, 주소: {hex(id(arr2))[-6:]}")
print(f"요소 리스트 주소: {hex(id(arr2[4]))[-6:]}")

# 3
arr2 = arr.copy()
print(f"결과: {arr2}, 주소: {hex(id(arr2))[-6:]}")
print(f"요소 리스트 주소: {hex(id(arr2[4]))[-6:]}")

# 4
arr2 = copy.copy(arr)
print(f"결과: {arr2}, 주소: {hex(id(arr2))[-6:]}")
print(f"요소 리스트 주소: {hex(id(arr2[4]))[-6:]}")

# 5
arr2 = copy.deepcopy(arr)
print(f"결과: {arr2}, 주소: {hex(id(arr2))[-6:]}")
print(f"요소 리스트 주소: {hex(id(arr2[4]))[-6:]}")
* 편의상 띄어쓰기 및 slicing적용함
arr 주소: 251580
요소 리스트 주소: 25ec00

# 1
결과: [1, 2, 3, 4, [5, 6, 7], 8]
주소: 251580
요소 메모리 주소: 25ec00

# 2
결과: [1, 2, 3, 4, [5, 6, 7], 8]
주소: 26d940
요소 메모리 주소: 25ec00

# 3
결과: [1, 2, 3, 4, [5, 6, 7], 8]
주소: 26dbc0
요소 메모리 주소: 25ec00

# 4
결과: [1, 2, 3, 4, [5, 6, 7], 8]
주소: 26d940
요소 메모리 주소: 25ec00

# 5
결과: [1, 2, 3, 4, [5, 6, 7], 8]
주소: 26dbc0
요소 메모리 주소: 26dac0

 

# 1

arr를 arr2에 복사했다

arr2는 arr를 참조하며 두 리스트와 요소들은 같은 주소를 가리킨다(얕은 복사)

 

# 2

arr를 전체 슬라이싱한 arr[:]를 arr2에 복사했다

리스트의 메모리 주소가 달라져 참조가 아닌 복사가 된 것으로 보이지만 요소 중 리스트의 주소를 보면 역시 같은 주소를 가리킨다

이 역시 얕은 복사로 분류한다

 

# 3

arr.copy()로 arr2에 복사했다

이 역시 #2번과 같이 리스트의 메모리 주소는 달라지지만 요소의 메모리 주소는 같다(얕은 복사)

 

# 4

copy 모듈의 copy()함수를 사용해 arr2에 복사했다

이 또한 #2, #3의 결과와 같다(얕은 복사)

 

# 5

copy 모듈의 deepcopy()함수를 사용해 arr2에 복사했다

리스트의 주소 뿐만 아니라 요소의 메모리 주소도 바뀌었다(깊은 복사)

 


sequence.insert(i, x)

i번째 요소에 x값을 삽입한다

 

  • i : i번째 인덱스
  • x : 삽입하고자 하는 값

아래 예제를 보자

arr = [1, 2, 3, 4, 5]

# 1
arr.insert(2, 100)
print(arr)
[1, 2, 100, 3, 4, 5]

 

# 1

인덱스가 2인 곳에 100이 삽입됐다

 


sequence.pop([i])

i번째 요소를 제거하고 제거한 요소를 리턴한다

 

  • i를 생략 시 가장 마지막 값이 제거된다
  • Optional Parameter
    • i : 제거하고자 하는 인덱스

아래 예제를 보자

# 1
arr = [1, 2, 3, 4, 5]
arr.pop()
print(arr)

# 2
arr = [1, 2, 3, 4, 5]
arr.pop(2)
print(arr)

# 3
arr = [1, 2, 3, 4, 5]
print(arr.pop(2))
[1, 2, 3, 4]
[1, 2, 4, 5]
3

 

# 1

i를 생략해 가장 마지막 값인 5가 제거됐다

 

# 2

인덱스가 2인 3이 제거됐다

 

# 3

#2와 같이 3을 제거하고 3을 리턴했다

 


sequence.remove(x)

시퀀스 내 x와 동등한 가장 첫번째 요소를 제거한다

 

  • x : 제거하고자 하는 요소 값

아래 예제를 보자

arr = [1, 2, 3, 4, 5, 4, 4, 4]

# 1
arr.remove(4)
print(arr)
[1, 2, 3, 5, 4, 4, 4]

 

# 1

제거하고자 하는 값인 4 중에 첫번째 값이 제거됐다

 


sequence.reverse()

시퀀스의 요소를 반대로 출력한다


아래 예제를 보자

arr = [1, 2, 3, 4, 5, 4, 4, 4]

# 1
arr.reverse()
print(arr)
[4, 4, 4, 5, 4, 3, 2, 1]

 

# 1

시퀀스를 자체를 반대로 바꿔서 출력한다


생각

시퀀스 타입의 함수 중에 기억해두면 정말 쓸만한 것들이 많다!

반응형