python

Python 잘 쓰는법: 리스트, 딕셔너리

Jueuunn7 2024. 9. 9. 11:30

1. 시퀀스 슬라이싱

파이썬엔 시퀀스라는 자료형이 있다.

시퀀스는 데이터를 순서대로 담는 자료형이다.

문자열: 'Python'파이썬이라는 문자열도 Char의 시퀀스이다.

배열: ['a', 'b', 'c']

튜플: ('a', 'b', 'c')

파이썬엔 이러한 시퀀스를 슬라이싱 할 수 있는 많은 방법이 있다.

>>> a = ['a', 'b', 'c', 'd']
>>> print(a)
['a', 'b', 'c', 'd']
>>> print(a[1:5])
['b', 'c', 'd']

기본적으로 list[시작:끝]으로 쉽게 할 수 있다. 시작 인덱스부터 출력되며 마지막 인덱스는 포함하지 않고 리턴된다.

>>> assert a[:1] == a[0:1]
>>> assert a[1:] == a[1:len(a)]

맨 앞부터 슬라이싱하는경우에는 0을 적지 않아도 되고, 마지막 인덱스는 len(list)를 사용하면 된다.

2. 스트라이드

list[시작:끝:증가값] 으로 시작:끝의 배열을 증가값으로 가져와 리턴해준다.

>>> a = 'Uhm.....'
>>> print(a[::-1])
.....mhU

이런식으로 쉽게 문자열도 뒤집을 수 있고,

>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> print(f"odds: {a[::2]}")
odds: [1, 3, 5, 7, 9]
>>> print(f"evens: {a[1::2]}")
evens: [2, 4, 6, 8, 10]

이렇게 짝수 홀수 구할때도 사용할 수 있다.

 

3. __getitem__, __setitem__, __delitem__

리스트를 호출해서 작업을 할땐 파이썬 내부에선 다른 방식으로 작동한다.

 

3-1. __getitem__(self, key)

>>> a = ['a', 'b', 'c', 'd', 'e']
>>> a.__getitem__(1)
'b'

파이썬에서 특정 인덱스의 값을 가져올땐 list[n] 의 방법을 사용한다.

이때 파이썬 내부에서는 list.__getitem__(n) 이 호출된다.

직접 구현할때에는 인덱스등의 에러를 직접 리턴해줘야한다.

 

3-2. __setitem__(self, key, value)

>>> a = ['a', 'b', 'c', 'd', 'e']
>>> a.__setitem__(1, 'No!')
>>> a.__getitem__(1)
'No!'

특정 인덱스의 값을 바꿀때에도 자동으로 list.__setitem__(key, value) 가 자동을 호출된다.

 

3-3. __delitem__(self, key)

>>> a = ['a', 'b', 'c', 'd', 'e']
>>> a.__delitem__(1)
>>> a.__getitem__(1)
'c'
>>> a
['a', 'c', 'd', 'e']

오브젝트 하나를 삭제할때 사용된다.

 

4. packing unpacking

4-1. packing

>>> def func(*a):
...     print(a, type(a))
...
>>> func('a', 'b', 'c', 1, 2, 3, ('a', 1))
('a', 'b', 'c', 1, 2, 3, ('a', 1)) <class 'tuple'>

>>> a = ['lee', 'noh', 'jeon', 'yoon']
>>> first, second, *others = a
>>> print(first, second, others)
lee noh ['jeon', 'yoon']

이렇게 많은 값들을 하나의 객체로 묶을 수 있는 패킹은 실제로 많이 사용한다.

몇개의 값만 지정하고 나머지 값들을 넣거나, 모든 값들을 넣을때 자주 사용된다.

 

4-2. unpacking

>>> numbers = [1, 2, 3, 4, 5]
>>> print(*numbers)
1 2 3 4 5
>>> sum(*numbers)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: sum() takes at most 2 arguments (5 given)

 

 

언패킹은 이렇게 모여있는 객체를 풀어주는 역할을 한다.

 

5. sort()

sort는 기본적으로 내부 타입을 보고 오름차순으로 정렬한다.

>>> a = ['lee', 'noh', 'jeon', 'yoon']
>>> a.sort()
>>> print(a)
['jeon', 'lee', 'noh', 'yoon']

이렇게 문자열은 잘 sort 해준다.

>>> class Car:
...      engine: int
...      cc: int
...      def __init__(self, engine, cc):
...              self.engine = engine
...              self.cc = cc
...      def __repr__(self):
...              return f'Car({self.engine}, {self.cc})'


>>> cars = [
... Car(3, 1500),
... Car(8, 3000),
... Car(12, 5000),
... Car(6, 3000)
... ]

객체배열일땐 정렬을 어떻게 할까?

>>> cars.sort()

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'Car' and 'Car'

그냥 sort 메서드를 실행하면 에러가 뜬다. 이럴땐 key 파라미터를 사용해서 정렬해야한다.

key 파라미터는 정렬 중인 리스트의 원소가 전달된다. key 파라미터에는 정렬 기준으로 사용할 값이 전달되어야 한다.

# engine 정렬
>>> cars.sort(key=lambda x: x.engine)
>>> print(cars)
[Car(3, 1500), Car(6, 3000), Car(8, 3000), Car(12, 5000)]

# cc 정렬
>>> cars.sort(key=lambda x: x.cc)
>>> print(cars)
[Car(3, 1500), Car(6, 3000), Car(8, 3000), Car(12, 5000)]