본문 바로가기

컴린이 일기장/Today I Learned

[TIL] 파이썬 정렬 함수 / Counter / defaultdict

반응형

[주절주절]

-

 

[Today I Learned]

# 파이썬 정렬 함수

1) sort : '변수.sort()' 형태로 사용하며 원본을 곧바로 변형시킨다. (제자리 정렬) 따라서 별도의 추가 공간이 필요하지 않다.

num_list = [5,2,4,1,3]
num_list.sort()
print(num_list)

[1,2,3,4,5]

 

2) sorted : 원본을 변형시키지 않고 정렬된 결과를 return한다. 

print(sorted([3,4,5,1,2])
[1,2,3,4,5]

+ sorted(문자열)을 할 경우 문자열 각각의 문자를 sort, list로 return한다.

 

- 두 메소드 모두 key와 reverse 파라미터를 갖는다.

1) key : 정렬의 기준이 될 값을 return하는 함수를 넣는다. lambda를 이용할 수 있다. 

str_list = ['안녕', '저녁뭐먹지', '비빔면', '돼지고기']

print(sorted(str_list, key=len))
['안녕', '비빔면', '돼지고기', '저녁뭐먹지']

print(sorted(str_list, key=lambda x: x[1]))
['저녁뭐먹지', '안녕', '비빔면', '돼지고기']

 

함수가 tuple을 return 하게 해 예외처리를 해줄 수도 있다. (아래 예시 참고)


2) reverse : 디폴트는 False이고 True를 입력하면 내림차순으로 정렬이 가능하다.

 

+ 로그 정렬

def sort_logs(logs):
    letters, digits = [], []

    for log in logs:        
        if log.split()[1].isdigit():
            digits.append(log)
        else:
            letters.append(log)

    letters.sort(key=lambda x: (x.split()[1:], x.split()[0]))

    return letters + digits

+ split() 함수의 디폴트값은 공백으로, 위와 같이 사용할 경우 공백에 대해 쪼개준다.

+ split()의 반대 역할로는 join이 있다. 사용법이 좀 특이함(?!)

str_list = ['hi','how', 'are', 'you']

joined_str = "".join(str_list)

print(joined_str)
hihowareyou

 

# Counter

- collections 모듈의 Counter 클래스는 dictionary를 확장한 클래스로, 데이터의 개수를 셀 때 유용하다.

paragraph = "Bob hit a ball, the hit Ball flew far after it was hit."
counts = Counter(paragraph.split())
print(counts)

 

- 개수를 센 후, 가장 많이 등장한 element를 뽑을 땐 most_common 메소드를 사용하면 된다.

 

+ 가장 흔한 단어

from collections import Counter

def most_common(paragraph, banned):

    # 전처리
    words = [word for word in re.sub(r'[^\w]',' ',paragraph).lower().split() if word not in banned]

    # Counts
    counts = Counter(words)

    return counts.most_common()[0][0]

 

# defaultdict

- 역시나 collections 모듈에 속하는 클래스로, key값이 없을 경우 미리 지정해놓은 디폴트값을 반환하는 딕셔너리이다. (일반 딕셔너리는 아래와 같은 코드에서 KeyError를 일으킨다.)

from collections import defaultdict

d = defaultdict(int)

d['A'] = 2
d['B'] = 8

print(d['C'])

 

+ 애너그램

from collections import defaultdict

def anagram(input):
    result = defaultdict(list)

    for i in input:
        k = "".join(sorted(i))
        result[k].append(i)

    return result.values()

 

[질문 노트]

-

 

 

반응형