프로그래머스 문제풀기

➡️문자열 내 마음대로 정렬하기

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]을 프린트함

  • 튜플을 정렬하는데 기본적으로 튜플은 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])

기타 답과 같이 정렬하는 방법

sorted(strings, key=lambda x: (x[n],x))
sorted(strings, key = lambda x : x[n]+x)
sorted(strings, key = lambda x : x[n]+x[:])
  • x[n]+x이 문자열이므로 첫번째문자가 같으면 그 이하 문자열로 정렬하기때문에 전체 문자열로 다시 정렬하는 것과 같은 효과
  • x[:] == x

파이썬

callable object

__call__: 스페셜 메소드. 객체를 함수 처럼 사용 할 수 있게 한다

  • 스페셜 메소드: 특정 상황에 인터프리터에 의해 호출 되는 메소드

  • 왜 굳이 객체를 함수 처럼 사용해야 하는가?
    → 함수에 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는 재사용이 불가능

  • iterable은 재사용가능
  • 제너레이터 표현식으로 만든 리스트축약식은 재사용 가능
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) # 아무것도 출력되지 않음

https://wikidocs.net/22802

profile
looooggi

0개의 댓글