[Python] List

DongHyeon Jung·2022년 9월 13일
0

Python

목록 보기
2/8
post-thumbnail

List Data Structure

먼저 시작하기에 앞서, 모두가 알만한 쉬운 내용은 가볍게 다루고 넘어갈 것이다
헷갈릴만한 포인트에 집중해서 리뷰를 할 예정이다

List란?

  • 배열과 비슷하다
  • 동적이라서 요청에 따라 크기를 늘리고 줄일 수 있다
  • 인덱스를 사용한다
  • 객체를 슬롯에 순차적으로 정렬하여 저장한다

유용한 메서드

remove

  • 일치하는 값(인덱스 값이 아님)을 찾을 때, 그 객체를 제거
  • 삭제하려는 객체의 값을 알 때 사용함
  • 리스트 크기 1 감소
  • 발견 못하면 에러 발생
>>> nums = [1, 2, 3, 4]
>>> nums.remove(2)
>>> nums
[1, 3, 4]

pop

  • 인덱스의 객체를 삭제할 때 사용됨
  • 삭제한 값을 반환한다
  • 리스트의 크기가 줄어든다
>>> nums = [1, 2, 3, 4]
>>> nums.pop()
4

>>> nums.pop(0)
1
>>> nums
[2, 3]

인덱스를 넣어줄 수도 있다

extend

  • 기존 리스트에 새로운 객체 리스트를 추가
  • 객체 리스트를 인자로 받는다
  • 두 리스트를 하나로 합칠 때 유용함
>>> nums.extend([5, 6, 7])
>>> nums
[2, 3, 5, 6, 7]

insert

  • append와 extend는 객체를 추가할 때 사용하지만 오른쪽 끝부분에서만 추가할 수 있다는 한계
  • 인덱스 값을 지정해서 원하는 곳에 객체를 추가할 수 있다
>>> nums.insert(2, [3, 4, 5])
>>> nums
[1, 2, [3, 4, 5], 3, 4, 5, 6, 7]

이런 식으로 리스트 객체도 원하는 자리에 추가할 수 있다

예제를 통해 알아보자

phrase = "Don't panic!"  
  
plist = list(phrase)  
# plist = ['D', 'o', 'n', "'", 't', ' ', 'p', 'a', 'n', 'i', 'c', '!']  
  
for i in range(4):  
    plist.pop()  
  
plist.pop(0)  
plist.remove("'")  
plist.extend([plist.pop(), plist.pop()])  
plist.insert(2, plist.pop(3))  
  
# from list to string  
new_phrase = ''.join(plist)  
print(plist)  
# ['o', 'n', ' ', 't', 'a', 'p']  
print(new_phrase)  
# on tap

복사같지만 복사가 아니다?

>>> first = [1, 2, 3]
>>> first
[1, 2, 3]

>>> second = first
>>> second
[1, 2, 3]

이것을 보면 second에 리스트를 복사한 것이라고 착각할 수 있다
그러나

>>> second.append(4)
>>> second
[1, 2, 3, 4]

>>> first
[1, 2, 3, 4]

어라??

second만 추가했는데 first도 같이 바뀐 것을 볼 수 있다
즉, 할당연산자로는 리스트를 복사할 수 없다
그렇다면...왜 똑같은 값이 나오는 걸까???

할당 연산자로 복사하는 것은 리스트 객체가 아니라 레퍼런스(reference) 이다

결국 first와 second는 같은 리스트를 가리키고 있던 것이다..!

그렇다면 리스트를 복사하려면 무엇을 이용해야 할까?

>>> third = second.copy()
>>> third.append(5)
>>> third
[1, 2, 3, 4, 5]

이렇게 copy() 메서드를 이용한다

정리하자면, 기존 리스트의 레퍼런스를 다른 변수에 할당하고 싶다면 할당 연산자(=)
객체를 복사하고 싶다면 copy 메서드를 사용해야 한다

slice

>>> letters = ['a', 'b', 'c']
>>> letters[0:1:1]
['a']

[시작값 : 중지값 : 스텝값]의 형태

이때, 스텝값을 이용해서 거꾸로 뒤집을 수도 있다

>>> new_word = "I'm DongHyun Jung"
>>> list = list(new_word)
>>> ''.join(list[::-1])
"gnuJ nuyHgnoD m'I"
>>> phrase = "Don't panic!"  
  
>>> plist = list(phrase)  
>>> # plist = ['D', 'o', 'n', "'", 't', ' ', 'p', 'a', 'n', 'i', 'c', '!']  
>>> new_phrase = ''.join(plist[1:3])  
>>> new_phrase = new_phrase + ''.join([plist[5], plist[4], plist[7], plist[6]])
>>> print(new_phrase)

on tap

예제를 통해 slice를 사용해서 배열 객체의 요소를 추출할 수 있다

하지만 리스트 메서드는 리스트의 기존 상태를 바꾸므로 destructive 동작인 반면, 슬라이스는 기존 리스트를 바꾸지 않으므로 nondestructive 동작이다

리스트를 사용하지 말아야 할 때

person = ['Favorite', 'chicken', 'gender', 'Male', 'name', 'Steve']

이러한 리스트 데이터가 있다고 가정해보자

하지만 여기엔 3가지 문제가 있다

  1. 여기서 인덱스 값으로 정보를 기억해야 하는 문제가 발생한다
  2. 인덱스로 person 객체의 데이터를 접근해야 하므로 귀찮다...
  3. 0, 2, 4번째 인덱스는 태그고, 1, 3, 5번째 인덱스는 데이터 값이다

이러한 문제를 딕셔너리를 통해 해결해야 한다(다음에..)

느낀점

기존에 알고 있던 익숙한 파이썬이었지만, 확실하게 알지 못했던 것들이 눈에 보이기 시작한다
물론 프로젝트를 만들면서 배우는 것도 좋지만, 때로는 대충 알고있는 언어를 이렇게 책을 정독해봄으로서 새로 깨닫게 되는 부분이 꽤 있다는 점이 마음에 든다

0개의 댓글