hangyeol   4년 전

정답처리는 받았는데, 다른 분들의 code를 보던 중에 약간 문법적?인 부분에서 이해가 안되는 부분이 있어서 질문남깁니다.

내장함수 sorted() 에 관한 것인데요. 예를 들어서 

x = ['happy', 'new', 'aba', 'abcabc']
for i in x:
    print(sorted(i, key=i.find))

이러한 code가 있을 때 결과가 

['h', 'a', 'p', 'p', 'y'] 

['n', 'e', 'w']

['a', 'a', 'b']

['a', 'a', 'b', 'b', 'c', 'c']

이렇게 나오게 되는데요 

key 매개변수 부분이 이해가 안갑니다...

첫번째로, find 함수를 객체의 각 요소마다 한 번씩 호출하여 그 반환값을 기준으로 정렬을 하는 것으로 알고 있는데, 반환값을 정확히 제가 인지를 못하고 있는 것 같습니다.

그리고 두번째는 find함수의 경우 find() 이렇게 뒤에 괄호를 안붙히고 그냥 호출하게 되면 주소값을 반환하는 것처럼 보이던데 괄호를 안붙혀주는게 맞나요...?

나름 sorted 메뉴얼도 찾아보고 구글링 등을 해봤는데 이해도 잘 안되고 엄밀하게 알고 넘어가고 싶어서 질문드립니다.

답 주시면 감사하겠습니다!

alexdraconian   4년 전

먼저 두 번째 질문의 해답으로, find의 'key' 인자는 '함수 자체'를 입력으로 받습니다. 그리고 각 요소들을 자동으로 하나씩 넣어서 키를 구합니다. 그러므로 괄호는 필요 없습니다. 괄호는 함수를 직접 실행하는 것이므로, "key=i.find()"를 넣으면 그냥 find()를 그대로 실행시켜버려서 매개변수가 없다는 오류를 볼 수 있습니다.


첫 번째 질문의 해답은 다음과 같습니다.

sorted 함수는 스트링을 입력받으면 먼저 리스트로 바꿉니다. "happy"의 경우 ["h", "a", "p", "p", "y"]가 되겠지요. 이제 이 알파벳들 각각을 key 함수에 대입합니다.

"h"를 넣으면, "happy".find("h") = 0이므로, "h"의 정렬 키는 0입니다.

"a"를 넣으면, "happy".find("a") = 1이므로, "a"의 정렬 키는 1입니다.

이런 식으로 전부 키를 구하면 ["h"=0, "a"=1, "p"=2, "p"=2, "y"=4]인데, 이미 0, 1, 2, 4 순서로 정렬되어 있으니 ["h", "a", "p", "p", "y"]를 그대로 반환합니다.

이걸 "abcabc"에도 적용해보면, ["a"=0, "b"=1, "c"=2, "a"=0, "b"=1, "c"=2]이므로 0, 1, 2 순으로 정렬하면 ["a", "a", "b", "b", "c", "c"]가 됩니다.

댓글을 작성하려면 로그인해야 합니다.