def solution(strings, n):
key_list=[x[n] for x in strings]
return [y[1] for y in (sorted([x for x in zip(key_list,strings)]))]
# [('a', 'cake'), ('a', 'car'), ('a', 'cat'), ('e', 'bed'), ('u', 'sun')]
짝을 지어서 x[0]으로 정렬해서 x[1]을 프린트함
key=lambda y:y[0]
정렬조건을 넣어주면 2차적으로 정렬시(y[0] 값이 같을 때) 원래 리스트에 나열되어있던 순서대로 정렬되어 오답이 된다. strings=["sun", "bed", "car","cat","cake"]; n=1
key_list=[x[n] for x in strings]
print(sorted([x for x in zip(key_list,strings)],key=lambda y:y[0]))
# [('a', 'car'), ('a', 'cat'), ('a', 'cake'), ('e', 'bed'), ('u', 'sun')]
print(sorted([x for x in zip(key_list,strings)],key=lambda y:(y[0],y[1])))
# [('a', 'cake'), ('a', 'car'), ('a', 'cat'), ('e', 'bed'), ('u', 'sun')]
print(sorted([x for x in zip(key_list,strings)]))
# [('a', 'cake'), ('a', 'car'), ('a', 'cat'), ('e', 'bed'), ('u', 'sun')]
🕳️TypeError: Object of type builtin_function_or_method is not JSON serializable
→ dict메소드 values( )랑 items( )에서 괄호 누락됨
🕳️TypeError: Object of type dict_values is not JSON serializable
dict_values(['car', 'bed', 'sun'])
→ dict.values( )를 써서 리턴하면 dict_values( )안에 리스트가 담긴 값이 리턴돼서
items()도 마찬가지로 리스트만 리턴되는 게 아님
→
dict_items([('a', 'car'), ('e', 'bed'), ('u', 'sun')])
생각해보니까 sorted(정렬대상, 정렬기준) 이니까 정렬 기준을 그냥 x[n]으로 하면 됐다..
정렬된 strings를 넣어주는 건 n번째 문자열이 같은 문자열일 경우 그냥 strings에 입력된 순서로 리스트에 들어가기 때문.
def strange_sort(strings, n):
return sorted(sorted(strings), key=lambda x: x[n])
key=lambda x:(x[0],x[1])
-ord(x[0])
sorted(strings, key=lambda x: (x[n],x))
sorted(strings, key = lambda x : x[n]+x)
sorted(strings, key = lambda x : x[n]+x[:])
스페셜 메소드: 특정 상황에 인터프리터에 의해 호출 되는 메소드
왜 굳이 객체를 함수 처럼 사용해야 하는가?
→ 함수에 attribute를 넣기 위해서는 해당하는 변수를 함수를 호출하기 전에 정의를 해줘야함
객체라는 것은 내부에 자신만의 데이터를 가질 수 있는 것을 의미하고, 객체가 생성되는 시점에 변수 초기화 또한 가능하다.
class Plus :
def __call__(self, x, y) :
return x + y
plus = Plus() # 함수를 객체로 만들고
n = plus(1, 2) # __call__ 을 정의해줬기 때문에
# plus.__call__(1, 2)이 실행된다.(객체를 함수처럼!)
# 없으면 TypeError: 'Plus' object is not callable
# ex.2 dd함수 안에 count라는 속성을 넣으려고 함
def add(x, y) :
add.count += 1
return x + y
add.count = 0 # add가 호출 되기 전에 초기화
# 없으면 AttributeError: 'function' object has no attribute 'count'
# 이런 초기화 작업을 매번 해줄 수는 없다. 따라서 클래스 내부에 다음과 같은 초기화 함수를 넣어줄 수 있다.
n = add(1, 2)
class Plus :
def __init__(self) :
self.count = 0
def __call__(self, x, y) :
self.count += 1
return x + y
함수가 attribute를 가지기 위해서는(= 상태를 가지는 함수를 만들기 위해서는) callable object를 사용하는 것(객체를 함수로 만들어 사용하는 것)이 편리하다.
https://kukuta.tistory.com/335
list.sort(key=len)
sorted(list,key=len)
제너레이터 표현식 genexpr는 리스트 축약식 안에 들어가는 식
iterator와 generator는 재사용이 불가능
gen=(x[n]+x for x in strings) # 괄호 없으면 에러
# <generator object <genexpr> at 0x000001A01E23C0B0>
for value in gen:
print(value) # 차례로 usun ebed acar acat acake 출력
for value in gen:
print(value) # 아무것도 출력되지 않음