문제 : 문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬
문제를 처음에 보고, string[i][n]을 키로 갖는 딕셔너리를 만들어 해결하면 되지 않을까 생각해서
코드를 작성하고 테스트를 돌렸더니, 원소로 주어진 문자열 하나가 사라졌다.
이유를 생각하던 중에
제약조건 중
1.인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 2.사전순으로 앞선 문자열이 앞쪽에 위치합니다.
이 있다는 것을 발견했다.
딕셔너리의 키값은 중복될 수 없으므로 정렬할 문자를 키값으로 딕셔너리를 작성하던 코드는 지우고,
아래와 같은 답을 작성하였다.
def solution(strings, n):
strings.sort() # 1
ch_list = [i[n] for i in strings]
ch_dict = {}
for i in range(len(strings)):
ch_dict[i] = ch_list[i]
return [strings[i[0]] for i in sorted(ch_dict.items(), key=lambda x: x[1])] #2
오늘 문제를 풀면서 명확히 알게 된 점은
1. sort()와 sorted()의 차이점/공통점
<차이점>
<공통점>
같은 기능을 더 쉽고 빠르게 만드는 기능을 제공하는 operator 모듈
operator 모듈에는 1. itemgetter(), 2. attrgetter() 및 3. methodcaller()가 있다.#1. itemgetter() from operator import itemgetter students = [ ("jane", 22, 'A'), ("dave", 32, 'B'), ("sally", 17, 'B'), ] result = sorted(students, key=itemgetter(1)) print(result) # [('sally', 17, 'B'), ('jane', 22, 'A'), ('dave', 32, 'B')] students = [ {"name": "jane", "age": 22, "grade": 'A'}, {"name": "dave", "age": 32, "grade": 'B'}, {"name": "sally", "age": 17, "grade": 'B'}, ] result = sorted(students, key=itemgetter('age')) print(result) # [{'name': 'sally', 'age': 17, 'grade': 'B'}, {'name': 'jane', 'age': 22, 'grade': 'A'}, {'name': 'dave', 'age': 32, 'grade': 'B'}]
# 2. attrgetter : 리스트요소가 클래스 요소라면 attgetter을 사용해야 한다. from operator import attrgetter class Student: def __init__(self, name, age, grade): self.name = name self.age = age self.grade = grade students = [ Student('jane', 22, 'A'), Student('dave', 32, 'B'), Student('sally', 17, 'B'), ] result = sorted(students, key=attrgetter('age'))
# 3. methodcaller()는 인자로 함수와 인자를 받는데, name 함수를, 뒤의 인자를 넣어서 반환한다. operator.methodcaller(name, /, *args, **kwarg) #는 아래와 같다. def methodcaller(name, /, *args, **kwargs): def caller(obj): return getattr(obj, name)(*args, **kwargs) return caller
lambda 매개변수 : 리턴값
매개변수가 여러개일 수 도 있고, default 값을 정해줄 수도 있지만, 자료형은 제한할 수 없다고 한다.
가끔 다른 사람들 코드 보다가 람다식이 있으면 앗... 어려운 코드 하면서
갑자기 어지러웠는데, 이제 자신있다! 자신있어~!
앗 슨배림들 코드
def strange_sort(strings, n):
return sorted(sorted(strings), key=lambda x: x[n])
#코드를 보고 든 생각 나는 뭘 한거지? 왜 이런저런 코드를 썼을까??? sorted가 뭘로 리턴되는지를 몰랐는가봉가... list로 리턴된다.
def strange_sort(strings, n):
def sortkey(x):
return x[n]
strings.sort(key=sortkey)
return strings
#sortkey를 람다로 안 쓰니 오히려 낯설다.
문제 풀기 시작한지도 며칠 안 되고
지금 이런말 하는건 웃기긴 한데.. 정말 재미있다.
게임하는 것 같다.
그리고 하나를 제대로 파라는 말이 뭔지 머리카락만큼 알 것 같다.
나 파이썬 잘 모르는구나 ^-^...
나아가자~! 가보자고옷~!