파이썬에서 행렬(리스트의 리스트)을 각 행에 포함된 None 값의 개수, 즉 빈도를 기준으로 정렬해야 하는 경우가 있습니다. 이럴 때는 별도의 함수를 정의한 뒤, 리스트 컴프리헨션과 not 연산자, len 메서드를 조합해 None의 개수를 계산하고, 그 결과를 sort 메서드의 key로 지정하면 손쉽게 해결할 수 있습니다.
예제 코드
아래는 None 빈도를 기준으로 행렬을 정렬하는 방법을 보여주는 예제입니다.
def get_None_freq(row):
return len([element for element in row if not element])
my_list = [[None, 24], [None, 33, 3, None],[42, 24, 55], [13, None, 24]]
print("The list is : ")
print(my_list)
my_list.sort(key = get_None_freq)
print("The result is : ")
print(my_list)
실행 결과
The list is : [[None, 24], [None, 33, 3, None], [42, 24, 55], [13, None, 24]] The result is : [[42, 24, 55], [None, 24], [13, None, 24], [None, 33, 3, None]]
코드 설명
get_None_freq라는 이름의 함수를 정의합니다. 이 함수는 리스트를 매개변수로 받아, 리스트 컴프리헨션으로 각 요소를 순회하면서not연산자를 사용해 해당 요소가 None인지 판별한 후, 그 개수(길이)를 구합니다.계산된 None의 개수가 함수의 반환값이 됩니다.
함수 외부에서는 여러 개의 행을 가진 리스트(행렬)를 정의하고 콘솔에 출력합니다.
sort메서드를 호출할 때 key 인자에 앞서 정의한 함수를 지정하여, 각 행의 None 개수를 기준으로 오름차순 정렬을 수행합니다.정렬이 완료된 결과가 콘솔에 출력됩니다.
실행 결과를 보면 None이 하나도 없는 [42, 24, 55]가 가장 앞에 위치하고, None이 두 개 포함된 [None, 33, 3, None]이 가장 뒤에 배치되는 것을 확인할 수 있습니다. 즉, None 개수가 적은 행부터 차례대로 정렬됩니다. 내림차순으로 정렬하고 싶다면 sort 메서드에 reverse=True 옵션을 추가하면 됩니다.