[파이썬] 반복문으로 defaultdict append

조회수 327회

dfs[0], dfs[1] ~ dfs[8] 까지 데이터가 있습니다.

from transformers import AutoTokenizer
from collections import defaultdict
tokenizer = AutoTokenizer.from_pretrained("bert-base-cased", do_lower_case = True)


# 0번
word_freqs_0 = defaultdict(int)
for text in dfs[0]['comment']:
    words_with_offsets = tokenizer.backend_tokenizer.pre_tokenizer.pre_tokenize_str(text)
    new_words = [word for word, offset in words_with_offsets]
    for word in new_words:
        word_freqs_0[word] = word_freqs_0[word] + 1

# 1번
word_freqs_1 = defaultdict(int)
for text in dfs[1]['comment']:
    words_with_offsets = tokenizer.backend_tokenizer.pre_tokenizer.pre_tokenize_str(text)
    new_words = [word for word, offset in words_with_offsets]
    for word in new_words:
        word_freqs_1[word] = word_freqs_1[word] + 1

이런식으로 8번까지 작성했습니다. 위 문장을 반복문을 사용해 word_freqs[0] ~ word_freqs[8]로 만들고 싶은데 어떻게 해야 할까요

word_freqs = defaultdict(int)

변수를 선언후 append 로 입력하고 싶은데 잘 안되네요

  • **word_freqs_0 = defaultdict(int)** 가 무슨 명령어인가요? 초보자 2022.1.18 17:15

1 답변

  • 좋아요

    0

    싫어요
    채택 취소하기

    아주 단순한 리팩토링 문제인데요. 반복되는 코드를 함수로 모아서 빼는 겁니다.

    # 0번
    word_freqs_0 = defaultdict(int)
    for text in dfs[0]['comment']:
        words_with_offsets = tokenizer.backend_tokenizer.pre_tokenizer.pre_tokenize_str(text)
        new_words = [word for word, offset in words_with_offsets]
        for word in new_words:
            word_freqs_0[word] = word_freqs_0[word] + 1
    
    # 1번
    word_freqs_1 = defaultdict(int)
    for text in dfs[1]['comment']:
        words_with_offsets = tokenizer.backend_tokenizer.pre_tokenizer.pre_tokenize_str(text)
        new_words = [word for word, offset in words_with_offsets]
        for word in new_words:
            word_freqs_1[word] = word_freqs_1[word] + 1
    

    여기에서 공통으로 반복되는 부분, 변경되는 부분을 찾아보면, dfs[0], dfs[1] 이 바뀌었고, word_freqs_0, word_freqs_1 이 바뀌었죠. 그리고 나머지는 다 똑같습니다. 이걸 자세히 보면, 어떤 df 가 입력으로 주어지면, word_freq (딕셔너리)를 반환하는 함수로 만들어 반복할 수 있다는 걸 알 수 있어요.

    def get_word_freq_from_df(df: pd.DataFrame):
        word_freq = defaultdict(int)
        for text in df['comment']:
            words_with_offsets =   
     tokenizer.backend_tokenizer.pre_tokenizer.pre_tokenize_str(text)
            new_words = [word for word, offset in words_with_offsets]
            for word in new_words:
                word_freq[word] = word_freq[word] + 1
        return word_freq
    

    함수 완성.

    결국 이 덩어리를 단위로 다시 하고 싶은 걸 생각하면,

    • 8개의 dfs[i] 에 대해서
    • 각각의 word_freq 를 구하여 그걸 동일한 모양의 리스트로 만들자.

    이걸 코드로 만들면

    word_freqs = []
    for df in dfs:
        word_freq = get_word_freq_from_df(df)
        word_freqs.append(word_freq)
    

    이걸 리스트 컴프리헨션으로 다시 쓰면,

    word_freqs = [ get_word_freq_from_df(df) for df in dfs ]
    
    • 감사합니다. 나눠서 생각했어야 했네요 Go Dweyw 2022.1.21 18:39

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)