# list 에는 sort함수를 이용하여 오름차순 내림차순을 만들 수 있음
numbers = [93, 86, 11, 68, 70]
numbers.sort()
print(numbers)
[11, 68, 70, 86, 93]
# sort의 기준이 여러개 인경우
class Tool:
def __init__(self, name, weight):
self.name = name
self.weight = weight
def __repr__(self):
return f'Tool({self.name!r}, {self.weight})'
#아래 예시는 sort를 통해 오름차순을 했을 때 특별한 기준이 없기 때문에 에러가 발생한다.
tools = [
Tool('수준계', 3.5),
Tool('해머', 1.25),
Tool('스크류드라이버', 0.5),
Tool('끌', 0.25),
]
tools.sort()
TypeError Traceback (most recent call last)
in
7 Tool('끌', 0.25),
8 ]
----> 9 tools.sort()
TypeError: '<' not supported between instances of 'Tool' and 'Tool'
# lambda에 오름차순
tools = [
Tool('수준계', 3.5),
Tool('해머', 1.25),
Tool('스크류드라이버', 0.5),
Tool('끌', 0.25),
]
print('미정렬:', repr(tools))
tools.sort(key=lambda x: x.name)
# lambda를 사용하여 name이라는 key를 기준으로 오름차순으로 정렬
print('\n정렬: ', tools)
미정렬: [Tool('수준계', 3.5), Tool('해머', 1.25), Tool('스크류드라이버', 0.5), Tool('끌', 0.25)]
정렬: [Tool('끌', 0.25), Tool('수준계', 3.5), Tool('스크류드라이버', 0.5), Tool('해머', 1.25)]
#람다에 무게를 오름차순으로
tools.sort(key=lambda x: x.weight)
print('무게순 정렬:', tools)
무게순 정렬: [Tool('끌', 0.25), Tool('스크류드라이버', 0.5), Tool('해머', 1.25), Tool('수준계', 3.5)]
places = ['home', 'work', 'New York', 'Paris']
places.sort()
print('대소문자 구분:', places) #대문자 먼저 그다음 소문자
places.sort(key=lambda x: x.lower())
print('대소문자 무시:', places)
대소문자 구분: ['New York', 'Paris', 'home', 'work']
대소문자 무시: ['home', 'New York', 'Paris', 'work']
#튜플을 이용한 예시
power_tools = [
Tool('드릴', 4),
Tool('원형 톱', 5),
Tool('착암기', 40),
Tool('연마기', 4),
]
saw = (5, '원형 톱')
jackhammer = (40, '착암기')
assert not (jackhammer < saw) # 예상한 대로 결과가 나온다 (Flase)
print(jackhammer < saw)
False
# 위 내용을 증명하는 코드
drill = (4, '드릴')
sander = (4, '연마기')
assert drill[0] == sander[0] # 무게가 같다
assert drill[1] < sander[1] # 알파벳순으로 볼 때 더 작다
assert drill < sander # 그러므로 드릴이 더 먼저다
print(drill[0] == sander[0])
print(drill[1] < sander[1])
print(drill < sander )
True
True
True
- 여기까지의 방식에서 제약식은 모두 오름차순이거나 내림차순이어야 한다.
#weight을 먼저 오름차순으로 비교하고 name을 다음 오름차순으로 비교
power_tools = [
Tool('드릴', 4),
Tool('원형 톱', 5),
Tool('착암기', 40),
Tool('연마기', 4),
]
power_tools.sort(key=lambda x: (x.weight, x.name))
print(power_tools)
[Tool('드릴', 4), Tool('연마기', 4), Tool('원형 톱', 5), Tool('착암기', 40)]
# 모두 오름차순 or 내림차순
power_tools.sort(key=lambda x: (x.weight, x.name),
reverse=True) # 모든 비교 기준을 내림차순으로 만든다
print(power_tools)
[Tool('착암기', 40), Tool('원형 톱', 5), Tool('연마기', 4), Tool('드릴', 4)]
power_tools.sort(key=lambda x: (-x.weight, x.name))
print(power_tools)
[Tool('착암기', 40), Tool('원형 톱', 5), Tool('드릴', 4), Tool('연마기', 4)]
#문자열은 역순이 불가능함
power_tools.sort(key=lambda x: (-x.weight, -x.name))
print(power_tools)
NameError Traceback (most recent call last)
in
----> 1 power_tools.sort(key=lambda x: (-x.weight, -x.name))
2 print(power_tools)
NameError: name 'power_tools' is not defined
# reverse와 -연산자를 섞으면 불가능
power_tools.sort(key=lambda x: (x.weight, -x.name),
reverse=True)
TypeError Traceback (most recent call last)
in
1 # reverse와 -연산자를 섞으면 불가능
----> 2 power_tools.sort(key=lambda x: (x.weight, -x.name),
3 reverse=True)
in (x)
1 # reverse와 -연산자를 섞으면 불가능
----> 2 power_tools.sort(key=lambda x: (x.weight, -x.name),
3 reverse=True)
TypeError: bad operand type for unary -: 'str'
#두번의 호출로 정렬된 모습
power_tools.sort(key=lambda x: x.name) # name 기준 오름차순
power_tools.sort(key=lambda x: x.weight, # weight 기준 내림차순
reverse=True)
print(power_tools)
Tool('착암기', 40), Tool('원형 톱', 5), Tool('드릴', 4), Tool('연마기', 4)]
# lamda에 길이순
tools = [
Tool('수준계', 3.5),
Tool('해머', 1.25),
Tool('스크류드라이버', 0.5),
Tool('끌', 0.25),
]
print('미정렬:', repr(tools))
tools.sort(key=lambda x:len(x.name))
# lambda를 사용하여 name이라는 key를 기준으로 길이순으로 정렬
print('\n정렬: ', tools)
미정렬: [Tool('수준계', 3.5), Tool('해머', 1.25), Tool('스크류드라이버', 0.5), Tool('끌', 0.25)]
정렬: [Tool('끌', 0.25), Tool('해머', 1.25), Tool('수준계', 3.5), Tool('스크류드라이버', 0.5)]