TIL no.75 - Kata - Python - 1 - Disemvowel Trolls

devzunky·2019년 11월 10일


목록 보기

요즘 Code Kata를 푸는 방식이 굳어지고 있다는 것을 느꼈습니다.
다른 사람들의 풀이를 보면서 반성해보는 시간을 갖기 위해
CodeWars를 짬짬히 풀어보려고 합니다.

1. Question

Trolls are attacking your comment section!

A common way to deal with this situation is to remove all of the vowels from the trolls' comments, neutralizing the threat.

Your task is to write a function that takes a string and return a new string with all vowels removed.

For example, the string "This website is for losers LOL!" would become "Ths wbst s fr lsrs LL!".

Note: for this kata y isn't considered a vowel.

2. My Solution

def disemvowel(string):
    vowels = ['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U']
    for character in string:
        if character in vowels:
          string = string[:string.find(character)]+string[string.find(character)+1:]
    return string

input string의 모든 character에 하나하나 접근해서 vowel인지 확인했고
vowel이라면 그 character 바로 앞까지의 string과
바로 뒤의 character부터의 string끝까지를 붙였습니다.

3. Method For Best Solution

python은 string타입에 대해 translate메서드를 제공합니다.

str.translate(table[, deletechars])

translate 메서드를 사용하기 위해
str.maketrans 메서드에 대해 공부할 필요가 있습니다.

str.maketrans메서드는 str.translate() 에 사용할 수 있는 table을 리턴해줍니다. 문법은 다음과 같습니다.

str.maketrans(x[, y[, z]])
  1. argument가 1개일 때
    dictionary타입을 인자로 넣어줘야 합니다.
    dictionary의 key,value로 mapping table이 만들어집니다.
>>> test_dict={'a':None, 'e':None}
>>> str.maketrans(test_dict)
{97: None, 101: None}```

|original value|convert value|

2. argument가 2개일 때
같은 길이의 string을 넣어줘야 합니다.

첫번째 인자로 받은 string과
두번째 인자로 받은 string의
같은 index의 character들끼리 mapping됩니다.

>>> intab = "aeiou"
>>> outtab = "12345"
>>> trantab = str.maketrans(intab, outtab)
>>> trantab
{97: 49, 101: 50, 105: 51, 111: 52, 117: 53}

|original vlaue|convert value|

  1. argument가 3개일 때
    3번째 인자로 들어오는 인자는 None으로 맵핑되는 chracter들을 명시하는 string입니다.
>>> intab='abcd'
>>> outtab='efgh'
>>> none_map='abxy'
>>> str.maketrans(intab,outtab,none_map)
{97: None, 98: None, 99: 103, 100: 104, 120: None, 121: None}

intab과 outtab에 의해 첫번째 mapping은 다음과 같습니다.

|origina value|convert value|

그리고 none_map이라는 세번째 인자가 None으로 mapping될 character들을 명시함으로써 mapping은 다음과 같이 바뀝니다.

|origina value|convert value|

4. Best Solution

def disemvowel(string):
    return string.translate(str.maketrans('','','aeiouAEIOU'))

천천히 위 Solution을 따져보겠습니다.


위 메서드로 인해 다음과 같은 테이블을 만듭니다.

|original value|convert value|

그뒤에 string.translate(table)메서드를 사용해서 string을 table에 맞게 translate합니다.


관심 있을 만한 포스트

0개의 댓글