티스토리 뷰

Python

[PYTHON] sorted()와 람다

PeonyF 2023. 11. 9. 17:44
반응형

key= 매개변수는 sorted() 함수 또는 다른 정렬이 가능한 함수에서 정렬 기준을 설정하기 위해 사용

원소들을 그 자체 값이 아닌 특정 기준에 따라 정렬하고 싶을때 사용

ex.숫자의 경우 크기 순서, 문자열의 경우 알파벳 순서(key 사용x), 문자열을 그 길이에 따라 정렬하고 싶다면 key=len을 사용하여 len 함수를 정렬 기준으로 설정

 

lambda x: x는 "x를 받아서 x를 반환하는 함수

lambda x: x는 원소를 그 자체 값에 따라 정렬할 때는 필요 없으며, 보다 복잡한 데이터 구조에서 특정 속성이나 값에 따라 정렬하고자 할 때 사용

 

number_tuples[x]: number_tuples 리스트의 x번째 원소에 접근하려 할 때 사용됩니다.

(number_tuples[x]와 같은 표현은 sorted() 함수의 람다 내에서는 사용되지 않음)

x[0]: x라는 튜플(또는 리스트)의 첫 번째 원소에 접근하려 할 때 사용

 

 

*문제

1. 숫자 리스트를 내림차순으로 정렬하기:

numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5]
=> sorted(numbers,reverse=True)

숫자 리스트를 내림차순으로 정렬하는 경우, lambda x: x를 사용할 필요가 없다. 왜냐하면 숫자는 자체 값에 따라 정렬할 수 있기 때문. 이 경우 sorted(numbers, reverse=True)만 사용해도 충분하다

 

 

2.문자열 리스트를 길이에 따라 오름차순으로 정렬하기:

words = ["banana", "apple", "cherry", "date"]
sorted(words,key=len)

 

3.튜플 리스트를 두 번째 요소에 따라 오름차순으로 정렬하기:

tuples = [(1, 'one'), (3, 'three'), (2, 'two'), (4, 'four')]
sorted(tuples,key=lamda x:x[1])

 

4.딕셔너리를 값에 따라 내림차순으로 정렬하기:

dict_data = {'apple': 10, 'banana': 2, 'cherry': 7, 'date': 3}
sorted(dict_data,key=dict_data.get,reverse=True)

 

5.객체 리스트를 객체의 나이에 따라 오름차순으로 정렬하기:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

people = [Person('Alice', 24), Person('Bob', 19), Person('Charlie', 22)]

=> sorted(people,key=lamda x:x.age)

 

6.딕셔너리 리스트를 특정 키의 값에 따라 내림차순으로 정렬하기:

dict_list = [{'name': 'Alice', 'age': 24},
             {'name': 'Bob', 'age': 19},
             {'name': 'Charlie', 'age': 22}]
=> sorted(dict_list,key=lamda x: x['age'],reverse=True)

 

7.문자열 리스트를 알파벳 역순으로 정렬하기:

strings = ["abc", "def", "ghi", "jkl"]
=> sorted(strings,reverse=True)

 

8.숫자 튜플 리스트를 첫 번째 요소의 내림차순, 두 번째 요소의 오름차순으로 정렬하기:

number_tuples = [(3, 1), (2, 2), (1, 3), (4, 1), (5, 2)]

'''
sorted(number_tuples, key=lamda x: number_tuples[x], reverse=True, key=lamda x: x[1], reverse=False)
key 매개변수를 한 번만 지정할 수 있으며, reverse 매개변수도 한 번만 지정할 수 있다.
'''

=> sorted(number_tuples, key=lamda x:(-x[0],x[1]))

 

9.이름과 성을 키로 하는 딕셔너리 리스트를 성에 따라 오름차순으로, 이름에 따라 내림차순으로 정렬하기:

name_dicts = [{'first': 'John', 'last': 'Doe'},
              {'first': 'Jane', 'last': 'Smith'},
              {'first': 'Alice', 'last': 'Doe'},
              {'first': 'Bob', 'last': 'Smith'}]

'''
sorted(name_dicts,key=lamda x: (x['first'],-x['last']))
문자열에 대해서는 직접 - (마이너스) 연산자를 사용할 수 없음 
'-' 연산자는 숫자에 대해 내림차순 정렬을 할 때 사용되며, 문자열에는 적용되지 않습니다.
문자열을 내림차순으로 정렬하려면, ord() 함수를 사용해야한다.
'-ord(x['first'][0]' : first 키의 첫 글자에 대한 유니코드 코드 포인트를 음수로 만들어 두 번째 정렬 기준으로 사용
sorted_name_dicts = sorted(name_dicts, key=lambda x: (x['last'], -ord(x['first'][0])))
다만 first 이름의 첫 글자에 대해서만 내림차순 정렬이 적용되므로 아래와 같이 해서 이름 전체에 대해 내림차순 적용한다
'''

=>  sorted(name_dicts, key=lambda x: (x['last'], ''.join(reversed(x['first']))))

 

10.복소수 리스트를 실수 부분에 대한 오름차순으로 정렬하기:

complex_numbers = [3+4j, 1-1j, 2+0j, 4+1j]

'''
sorted(complex_numbers, reverse=False) => x(복소수가 > 또는 < 연산자로 직접 비교될 수 없음)
복소수는 실수부와 허수부의 조합으로 되어 있기 때문에 파이썬의 정렬 함수인 sorted()는 복소수를 직접 비교할 수 없다.
복소수 = real(실수부)+imag(허수부) ex. 3+4j = 3(실수부)+4(허수부)
각 복소수 x에 대해 실수부 x.real을 반환하고, sorted()는 이 값을 기준으로 복소수를 정렬한다.
'''

=> sorted_complex_numbers = sorted(complex_numbers, key=lambda x: x.real)

 

11. 나이를 기준으로 사용자 정보가 담긴 딕셔너리 리스트를 오름차순으로 정렬하기:

users = [
    {"name": "Alice", "age": 25},
    {"name": "Bob", "age": 20},
    {"name": "Charlie", "age": 30}
]
=> sorted(users, key=lamda x: x['age'])

 

12.튜플의 첫 번째 요소로 내림차순 정렬하고, 동일한 첫 번째 요소를 가진 경우 두 번째 요소로 오름차순 정렬하기:

tuples = [(1, 'e'), (2, 'd'), (2, 'c'), (2, 'b'), (1, 'a')]
=> sorted(tuples,key=lamda x: (-x[0],x[1]))

 

13.제품 정보가 담긴 딕셔너리 리스트를 가격 오름차순으로 정렬하고, 가격이 같다면 이름 알파벳 순으로 오름차순 정렬하기:

products = [
    {"name": "laptop", "price": 800},
    {"name": "phone", "price": 500},
    {"name": "camera", "price": 1500},
    {"name": "headphones", "price": 100},
    {"name": "book", "price": 20},
    {"name": "monitor", "price": 800}
]
=> sorted(products,key=lamda x:(x['price'],x['name']))

 

14.좌표 리스트를 원점(0,0)으로부터의 거리에 따라 오름차순으로 정렬하기

points = [(1, 2), (3, 1), (0, 0), (2, 2), (1, 1)]
=> sorted(points,key=lamda x:(x[0]**2+x[1]**2)
'''
sorted() 함수는 전체 리스트를 한 번에 처리하며, 각 원소의 key 함수 결과값을 비교하여 최종적으로 정렬된 리스트를 생성합니다.
sorted() 함수는 내부적으로 정렬 과정에서 각 원소의 key 함수에 의해 계산된 값을 사용하여 비교하고, 이를 기반으로 전체 리스트를 정렬합니다. 
각 원소에 대해 key 함수의 결과값이 무엇인지는 우리가 직접 볼 수는 없지만, sorted() 함수는 이 값을 메모리에 저장하고 있으며, 이 값을 사용하여 원소들을 올바른 순서로 정렬합니다.
'''

 

 

#sorted 내부에 대해서 더 공부하기

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함