[응용 문법] - 여러가지를 고려해야 하는 최대소 & 정렬

bob_ssso·2022년 1월 25일
0

파이썬

목록 보기
8/9

최대 최소


다음과 같은 2차원 배열의 요소들을 다양한 방면으로 최대 최소를 구해보자... 최대 최소가 아니더라도 sort 등에서 쓰일 수 있을 것 같음

arr = [[1, 7, 12], [4, 7, 13], [1, 5, 17], [3, 5, 20], [2, 4, 24], [
    1, 4, 28], [3, 6, 37], [5, 6, 45], [2, 5, 62], [1, 2, 67], [5, 7, 73]]

리스트 원소합의 최대값

max_num = max(arr)
print(numvert) # -> "[5, 7, 73]"

전체 원소의 최대값 - map 함수 이용

map이란 iterable을 받아서 각 요소에 함수를 적용해주는 함수. map(적용시킬 함수, 적용할 요소들). map의 리턴값은 iterator이기 때문에 list 타입으로 형변환해서 사용한다.

max_num = max(map(max,arr))
print(max_num) # -> "73

2차원 리스트의 특정 열의 요소, [_][m] 중에서의 최대값

만약에 내가 위의 배열에서 [12, 13, 17,,,] 이렇게 3번째 요소(2번쨰 인덱스인 친구들)들만 묶어 리스트를 만들고 싶다면? zip함수를 사용하면 된다. zip외에도 numpy나 pandas를 이용하면 좀 더 깔끔한 코드가 된다.

index_two = list(zip(*arr))[2]
min_num = min(index_two)
print(min_num) # -> 12

zip 함수 참 신기한 친구다 껄껄.

a = ("John", "Charles", "Mike")
b = ("Jenny", "Christy", "Monica", "Vicky")

x = zip(a, b)

print(tuple(x))

print(list(zip(*a)))

위 코드의 실행결과는 아래처럼 나온다.

(('John', 'Jenny'), ('Charles', 'Christy'), ('Mike', 'Monica'))
[('J', 'C', 'M'), ('o', 'h', 'i'), ('h', 'a', 'k'), ('n', 'r', 'e')]

정렬


구글링을 하다보니까 a[_][0]을 '행', a[_][1]을 '열'로 칭하는 것 같다. 뭔가 찰떡같은 느낌은 아니지만 나도 용어가 애매했기에 행, 열이라고 칭해야지,,,

값 기준 정렬

arr = [[1,4],[0,5],[3,2]]
arr.sort(key = lambda x:x[0])
print(arr) # -> [[0,5],[1,4],[3,2]]

이때 sort부분에서 x:-x[0] 로 설정하면 내림차순 정렬, x:x[1]로 설정하면 열 기준 정렬이 된다. 또한 x:(x[1],x[0])와 같이 설정하면 열 값이 같을 경우 행값을 기준으로 오름차순 정렬할 수 있다. 문자열에서는 x[0]를 해당 문자열의 첫번째 문자라고 볼 수 있다.

길이 기준 정렬

arr = ['ac','abc','a']
arr.sort(key = len)
print(arr) # -> ['a','ac','abc']

배열 요소의 길이 별로 정렬하고 싶을 때는 위와 같이 코딩한다. 문자열 관련 함수에서 자주 쓰는 것 같다.

만약 문자열 리스트에서 첫번째 문자로 정렬하는데, 동등한 문자일 경우 그 내에서 길이로 정렬하고 싶으면 어떻게 해야될까? 예를 들어 ['1', '12', '123', '2', '27']와 같이 정렬하고자 한다면, arr.sort(key=lambda x:(x[0],len(x))) 와 같이 하면 되는 것을 발견했다.
.
.
sort함수에서 key = lenkey = lambda를 동시에 사용하지 못해서 감으로 찍었는데 동작되어서 기뻤다...◠‿◠

profile
밥소🐈

0개의 댓글