먼저 시작하기에 앞서, 모두가 알만한 쉬운 내용은 가볍게 다루고 넘어갈 것이다
헷갈릴만한 포인트에 집중해서 리뷰를 할 예정이다
>>> nums = [1, 2, 3, 4]
>>> nums.remove(2)
>>> nums
[1, 3, 4]
>>> nums = [1, 2, 3, 4]
>>> nums.pop()
4
>>> nums.pop(0)
1
>>> nums
[2, 3]
인덱스를 넣어줄 수도 있다
>>> nums.extend([5, 6, 7])
>>> nums
[2, 3, 5, 6, 7]
>>> 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 메서드를 사용해야 한다
>>> 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가지 문제가 있다
- 여기서 인덱스 값으로 정보를 기억해야 하는 문제가 발생한다
- 인덱스로 person 객체의 데이터를 접근해야 하므로 귀찮다...
- 0, 2, 4번째 인덱스는 태그고, 1, 3, 5번째 인덱스는 데이터 값이다
이러한 문제를 딕셔너리를 통해 해결해야 한다(다음에..)
기존에 알고 있던 익숙한 파이썬이었지만, 확실하게 알지 못했던 것들이 눈에 보이기 시작한다
물론 프로젝트를 만들면서 배우는 것도 좋지만, 때로는 대충 알고있는 언어를 이렇게 책을 정독해봄으로서 새로 깨닫게 되는 부분이 꽤 있다는 점이 마음에 든다