b = a
print('Before a', a) # ['a', 'b', 99, 22, 14, 'h']
print('Before b', b) # ['a', 'b', 99, 22, 14, 'h']
a[:] = [101, 102, 103]
assert a is b
print('After a', a) # [101, 102, 103]
print('After b', b) # [101, 102, 103]
위의 코드는 a가 가리키는 리스트 객체가 바뀌어서 a와 b가 달라졌음을 보여준다.
x = ['red','orange','yellow','green','blue','purple]
odds = x[::2]
evens = x[1::2]
print(odds)
print(evens)
>>>
['red','yellow', 'blue']
['orange', 'green', 'purple']
::2
: 처음부터 시작해서 매 두 번째 아이템을 선택한다::-2
: 끝부터 시작해서 반대 방향으로 매 두번째 아이템을 선택한다위와 같은 표기를 stride 문법이라고 하는데, 3가지 인수가 들어가기도 한다
가급적이면 start, end, stride를 세개 다같이 사용하지 않는 것이 좋다.
car_ages = [0, 9, 4, 8, 7, 20, 19, 1, 6, 15]
car_ages_descending = sorted(car_ages, reverse = True)
oldest, second_oldest = car_ages_descending
>>>
Traceback ...
ValueError: too many values to unpack (expected 2)
이런 경우에는 가장 큰 값과 그다음으로 큰 값을 가져오는데 필자가 소개한 몇가지 방법이 있다.
oldest = car_ages_descending[0]
second_oldest = car_ages_descending[1]
others = car_ages_descending[2:]
print(oldest, second_oldest, others)
>>>
20 19 [15, 9, 8, 7, 6, 4, 1, 0]
oldest, second_oldest, *others = car_ages_descending
print(oldest, second_oldest, others)
>>>
20 19 [15, 9, 8, 7, 6, 4, 1, 0]
class Tool:
def __init__(self, name, weight):
self.name = name
self.weight = weight
def __repr__(self):
return f'Tool({self.name!r}, {self.weight})'
tools = [
Tool('level', 3.5),
Tool('hammer', 1.25),
Tool('screwdriver', 0.5),
Tool('chisel', 0.25),
]
print('Unsorted:', repr(tools))
tools.sort(key=lambda x: x.name)
print('\nSorted: ', tools)
>>>
Unsorted: [Tool('level', 3.5),
Tool('hammer', 1.25),
Tool('screwdriver', 0.5),
Tool('chisel', 0.25)]
Sorted: [Tool('chisel',0.25),
Tool('hammer',1.25),
Tool('level',3.5),
Tool('screwdriver', 0.5)]
.keys()
.values()
.items()
.popitem()
try:
count = counters[key]
except KeyError:
count = 0
그러나 필자는 더 짧은 코드를 소개했다
count = counters.get(key, 0)
counters[key] = count + 1
그러나 위의 코드는 읽기 좋지 않다. 따라서 최종적으로 추천한 형태는
try:
counter[key] += 1
except KeyError:
counters[key] = 1
이외에도 필자가 detect and handle missing keys in dictionaries를 할 때 추천한 방법에는 4가지가 있다.
counter 을 포함한 가장 기본적인 방법이 딕셔너리를 다룰 때 좋다.
만약 setdefault 방법의 dict이 가장 좋아보일 때는 defaultdict를 대신에 고려해야한다.
visits.setdefault('France', set()).add('Arles') # short
if (japan := visits.get('Japan')) is Non: # Long
visits['Japan'] = japan = set()
print(visits)
>>>
{'Mexico': {'Tulum', 'Puerto Vaallarta'},
'Japan': {'Kyoto', 'Hakone'},
'France': {'Arles'}}