"""
p, 175 ~ 177
< 파이썬의 정렬 라이브러리 >
- 정렬 알고리즘 문제는 어느 정도 정해진 답이 있는, [ 즉 외워서 잘 풀어낼 수 있는 문제 ].

- 미리 만들어진 라이브러리를 이용하는 것이 ' 효과적인 경우가 더 많다 '.

- 파이썬은 기본 정렬 라이브러리인 ' sorted() 함수를 제공 '.
  퀵 정렬과 동작 방식이 비슷한 [ 병합 정렬을 기반으로 만들어졌음. ]
  퀵 정렬보다 느리지만 < 최악의 경우에도 O(N log N)을 보장 >한다는 특징.

- 이러한 sorted() 함수는 [ 리스트, 딕셔너리 자료형 등을 입력 ]받아 
  정렬된 결과를 출력. 
  " 집합 자료형 "이나 " 딕셔너리 자료형 "을 입력받아도 
  ★ 반환되는 결과 ★는 [ 리스트 자료형 ]이다.
"""

# 6-7.py sorted 소스코드
array = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8]

result = sorted(array)
print(result) # -- 반환되는 결과는 리스트 자료형.
#--------------------------------------------------------------------------
# 6-8.py sort 소스코드
'''
- 리스트 변수가 하나 있을 때 내부 원소를 바로 정렬할 수도 있다.
  [ 리스트 객체의 ] 내장 함수인 sort()를 이용하는 것.
- 이를 이용하면 별도의 정렬된 리스트가 반환되지 않고, ★ 내부 원소가 바로 정렬 ★ .
'''
array = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8]

array.sort() # [ 리스트 객체의 ] 내장 함수인 sort()를 이용
print(array)

#--------------------------------------------------------------------------
# 6-9.py 정렬 라이브러리에서 [ key를 활용한 소스코드 ]
'''
- 또한 sorted()나 sort()를 이용할 때에는 " key 매개변수를 입력 "으로 받을 수 있다.
- key 값으로는 하나의 함수가 들어가야 하며 이는 정렬 기준이 된다.
  리스트의 데이터가 [ 튜플로 구성 ]되어 있을 때, 
  각 데이터의 [ 두 번째 원소를 기준 ]으로 설정하는 경우 
  아래와 같은 형태의 소스코드를 작성. 
- 혹은 람다(lamda)함수를 사용할 수도 있는데, 자세한 내용은 부록에서 확인
  
< 강력한 sorted와 lambda 함수 ! >
- [ key 인자에 함수를 넘겨주면 ] 해당 함수의 반환값을 비교하며 순서대로 정렬한다.
-----------------------------------------------------------

오름차순 정렬 : sorted(a, key=lambda x:x[0]) --> X는 인자를 의미하고, 뒤의 X는 조건
내림차순 정렬 : sorted(a, key=lambda x:-x[0]) 
- 즉, 위의 코드는 [ 인덱스 0번째 요소를 기준 ]으로 오름차순, 내림차순으로 정렬을 하겠다를 뜻함.
-----------------------------------------------------------

※ '-' 마이너스만 붙여주면 " 내림차순 "으로 만들 수 있다. !!!!
※ 요소가 여러개일 경우 [ 각 요소마다 정렬기준을 정해줄 수 ] 있다. 
  ex) sorted(a, key=lambda x: (x[0], -x[1])
※ '-' 말고 reverse=True로도 "내림차순" 만들 수 있다.

-----------------------------------------------------------
# 아이템 [ 첫 번째 인자를 기준 ]으로 " 오름차순 "으로 먼저 정렬하고,
# 그리고 그 안에서 [ 다음 두 번째 인자를 기준 ]으로 " 내림차순 "으로 정렬하게 하려면, 
  아래와 같이 할 수 있다.
e = [(1, 3), (0, 3), (1, 4), (1, 5), (0, 1), (2, 4)]
f = sorted(e, key = lambda x : (x[0], -x[1]))
출력:  f = [(0, 3), (0, 1), (1, 5), (1, 4), (1, 3), (2, 4)]

'''
array = [('바나나', 2), ('사과', 5), ('당근', 3)]

def setting(data):
    return data[1] # 각 데이터의 [ 두 번째 원소를 기준 ]으로 [ 정렬 설정 ].

result = sorted(array, key=setting)
print(result)

# data[0] 인경우 한글 기준으로 정렬
# 당근, 바나나, 사과로 출력.





