본문 바로가기
Python

[Python] list (sequence type) : summary

by ds31x 2023. 7. 12.

list (Sequence Type) : Summary

listordered mutable collection으로, collection을 위한 python data type들 중 가장 많이 사용된다.

C에서의 array와 같이 가장 기본적인 collection임.
단, heterogeneous item을 가질 수 있으며,
여러 methods를 가지는 object(객체)라는 점이 array와 다름.

 

Python에서 대표적인 sequence type인 것은 다음 세가지임.

  • list : mutable sequence
  • tuple : immutable sequence
  • string : immutable text sequence

sequence type은
indexing이 element의 위치(순서)에 의해 이루어지기 때문에
순서(order)가 매우 중요함.

 

listtuple은 매우 유사해서 tuple을 immutable list라고 부르기도 함.

  • list는 square bracket []를 이용.
  • tuple은 parentheses ()를 이용.

Indexing: 개별 item 접근 및 갱신

a = [0,1,2,3,4]
print(a[1])  # 1
print(a[-1]) # 4
  • zero-based indexing (or numbering)임.
  • square bracket을 통한 indexing.
  • negative index를 이용하여 뒤에서부터 접근이 가능함. [-1]은 맨 마지막 요소를 가르킴.
a = [0,1,2,3,4]
a[-2] = 100 # replace the next-to-last element
print(a) # [0,1,2,100,4]

slicing: 특정 부분을 한번에 지정.

list의 특정 부분을 한번에 지정하여 값을 얻어냄.

  • list_name[start:end:step] 으로 구성됨.
  • 아래의 예제처럼 다양하게 일부만 지정가능함 (생략된 경우엔 start는 0, end는 전체갯수, step은 1이 기본값임) 
  • end는 range의 경우와 마찬가지로 exclusive임.
  • slicing으로 지정한 영역은 assignment에서 left side에 놓일 수 있음
x = [-1,0,1,2,3,4,5,6,7,8,9]

first_three  = x[:3]  # [-1, 1, 2]
three_to_end = x[3:]  # [3, 4, ..., 9]
one_to_four  = x[1:5] # [1, 2, 3, 4]
last_three   = x[-3:] # [7, 8, 9]

without_first_and_last = x[1:-1] # [1, 2, ..., 8]
copy_of_x = x[:]  # [-1, 1, 2, ..., 9]

print(f'{first_three=}')
print(f'{three_to_end=}')
print(f'{one_to_four=}')
print(f'{last_three=}')
print(f'{without_first_and_last=}')
print(f'{copy_of_x=}')
  • colon (:) 앞이 start index 이고 뒤는 end_index +1 이 주어짐.
  • slicing으로 얻어진 list는 새로운 id를 갖는 list이지만, item들은 같은 원본의 object들을 가르키고 있음.
    • slicing 이후 특정 idx의 item에 대해 새로운 assignment를 할 경우,
    • 원본이 바뀌지 않고 해당 item만이 할당된 새로운 object를 참조하게 된다.
    • 주의할 건, NumPy등에서는 실제로 array기반으로 동작하여 slicing은 단순히 viewer에 불과하기 때문에 원본도 변경 된다.

결과는 다음과 같음.

first_three=[-1, 0, 1]
three_to_end=[2, 3, 4, 5, 6, 7, 8, 9]
one_to_four=[0, 1, 2, 3]
last_three=[7, 8, 9]
without_first_and_last=[0, 1, 2, 3, 4, 5, 6, 7, 8]
copy_of_x=[-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

 

list에서 slicing은 새로운 객체(shallow copy)를 생성함

(Python 표준 list의 경우이고, NumPy 등에선 다름).

slicing으로 얻은 b에서 item할당은 원본에 영향을 주지 않음. b는 새로운 id의 list임.

slicing을 assignment의 left side에 둘 경우, step의 지정여부에 따라 동작이 조금 다름:

  • step을 사용하지 않는 경우, right side의 갯수가 slicing으로 지정된 element의 갯수와 다르더라도 할당이 됨.
    • 즉, empty list로 할당을 하면 특정 영역을 지울 수 있음.
    • a[1:3] = [] 이 동작함: 이 경우 index 1,2인 element가 리스트 a에서 제거됨.
  • step을 사용하는 경우는 left side와 right side의 갯수가 일치해야함.

+ and * operation (operator overloading)

Type에 따라 지원되는 Operator가 다르고,
"동일한 Operator 기호"라도 operand(피연산자) type에 따라 다른 동작을 보임.

+list 에서 일종의 concatenation 을 수행함.

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

c = a+b # [1,2,3,4,5]

 

 

*list 가 반복되어 concatenation이 이루어짐.

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

 


in membership operation

sequence type에서는 in 연산의 효율이 좋지 못함

  • 처음부터 끝까지 다 확인을 해야하기 때문에 권장되지 않음.
  • set 의 사용을 추천.

 

또한 string의 경우와 달리 list에서는 single item 단위로만 in 연산이 동작한다. 다음의 예를 참고하라.

l = [ 1, 2, 3, 4, 5, 6]

if 1 in l:
  print('True')
else:
  print('False')

if [2,3,4] in l:
  print('True')
else:
  print('False')

 

결과는 다음과 같음.

True
False

 

참고로 string의 경우 다음과 같음.

s = "abcedfg"
sub_s = "ce"

print(f'{(sub_s in s)=}') # (sub_s in s)=True

정렬

a = [ 3, 5, 1, 4, 2 ]
c = sorted(a) # a는 그대로임. 정렬된 새로운 list object가 생성되어 반환됨.
a.sort()      # a가 정렬되어 update됨.
print(c)
print(a)
print(a is c) # a와 c가 같은 object인가 (id가 같은지)
print(a == c) # a와 c의 값이 같은지 체크.
  • a.sort() 메소드를 호출시 반환값이 None임. 반환값으로 a를 받지 않도록 주의할 것.
  • sort() 메소드는 자신이 호출된 object를 갱신하므로 immutable인 tuple에서는 제공되지 않음.
  • 역순으로 정렬을 원한다면 a.sort(reverse = True)를 이용한다.
  • 기본적으로 오름차순, 알파벳순임.

결과는 다음과 같음.

[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
False
True

 


tuple을 item으로 가지는 list의 정렬에서는
key 파라메터에 function 객체를 지정하여

item 의 여러 요소 중에서 무엇으로 정렬할지를 정할 수 있음.

a = [(1,'a'), (0,'b'), (2,'c')]

a.sort(key = lambda x: x[0]) # item인 tuple의 첫번째 요소를 기준으로 정렬.
print(a) # [(0, 'b'), (1, 'a'), (2, 'c')]
a.sort(key = lambda x: x[1]) #item인 tuple의 첫번째 요소를 기준으로 정렬.
print(a) # [(1, 'a'), (0, 'b'), (2, 'c')]
  • 위의 예에서는 lambda function을 사용했으나, def를 통한 function을 지정해도 된다.

list 의 methods

2023.07.17 - [Python] - [Python] List's methods

 

[Python] List's methods

Methods of List 일반적으로 object에 대해 method를 호출할 경우, 해당 object의 관련 attribute의 값이 바뀌고 None을 반환하는 경우가 많다. (단, NumPy나 Pandas 등의 경우, 해당 object의 값을 바꾸면서 바뀐 objec

ds31x.tistory.com


관련 ipynb.

https://gist.github.com/dsaint31x/6794486c7fca7ab0632098c1989d0af8

 

py_list_summary.ipynb

py_list_summary.ipynb. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com


같이 읽어보면 좋은 자료들

2024.04.15 - [분류 전체보기] - [Python] collections.abc

 

[Python] collections.abc

2023.10.06 - [Pages] - [Python] Collections collections.abc 와 Python의 DataStructure. Python의 Data structure는 실제적으로 collections.abc 라는 abstract base class (abc) mechanism를 통한 hierarchy로 구성된다. 일반적으로 list, tuple

ds31x.tistory.com

2024.03.15 - [Python] - [DL] Tensor 간의 변환: NumPy, PyTorch, TensorFlow

 

[DL] Tensor 간의 변환: NumPy, PyTorch, TensorFlow

pytorch와 numpy의 경우, 텐서를 추상화하고 있는 tensor와 ndarray 를 제공하며, 이 둘은 zero-copy interoperability를 가진다고 말할 수 있을 정도로 상호호환이 가능하다. TensorFlow도 numpy와 상당히 연관되어

ds31x.tistory.com