2014-04-19 3 views
4

제목에서 가능한 한 명확히하기 위해 노력했지만 간략하게 설명하기는 어렵습니다. 나는 어떤 모음에서 모든 모음을 제거해야합니다. 그렇게, 난 그 문자열의 문자로 구성된 목록을 통과 루프를 만든 모음을 제거하고 다음을 결합 :문자열에서 모음을 제거하십시오.

def anti_vowel(text): 
    vow = ["a", "e", "i", "o", "u"] 
    chars = [] 

    for i in text: 
     chars.append(i) 

    for i in chars: 
     if i.lower() in vow: 
      chars.remove(i) 

    return "".join(chars) 

문제는 그 코드를 실행하면 항상있을 것입니다 모음이 삭제되지 않습니다. 예 :

>>> anti_vowel("Hey look Words!") 
Hy lk Words! 

>>> anti_vowel("Frustration is real") 
Frstrton s ral 

나는 파이썬 전문가가 아니지만 혼란 스럽다. 다른 문자를 지우고 다른 문자를 지우지 않는 이유는 무엇입니까?

+3

[this] (http://arshajii.com/coding-faqs/conc-list-mod.html)를 참조하십시오. – arshajii

+0

목록을 반복하고 동일한 목록에서 요소를 제거하는 것이 좋지 않다는 것을 알고 있습니다. 'copylist = origlist [:]'를 복사 할 수는 있지만 원하는 것을 할 수있는 다른 방법이 있습니다 – zlr

+0

문자열에서 모음을 제거하려면 다음과 같이 사용할 수 있습니다 :'text.translate ({ord (v) : ' 'for a'aeiouAEIOU '})'. 당신이 그걸 요구하는 것이 아니기 때문에 나는 단지 여기를 코멘트로 남겨 둘 것입니다. – rboy

답변

5

@arshajii의 의견은 루프에서 문자를 제거하는 것이 좋지 않은 이유를 설명합니다. 는 (이 달성의보다 효율적인 방법이 있습니다하지만 당신은 배우고있는 것 같습니다, 그래서 여기를 떠날 것이다.), 코드에서이 문제를 해결하려면

def anti_vowel(text): 
    vow = ["a", "e", "i", "o", "u"] 
    chars = [] 

    for i in text: #No need of the two separate loops 
     if i.lower() not in vow: 
      chars.append(i) 

    return "".join(chars) 

데모 :

>>> def anti_vowel(text): 
...  vow = ["a", "e", "i", "o", "u"] 
...  chars = [] 
...  for i in text: #No need of the two separate loops 
...   if i.lower() not in vow: 
...    chars.append(i) 
...  return "".join(chars) 
... 
>>> anti_vowel("Hey look Words!") 
'Hy lk Wrds!' 
>>> anti_vowel("Frustration is real") 
'Frstrtn s rl' 
>>> 
mytext = 'hello world!' 
vowels = ['a', 'e', 'i', 'o', 'u'] 
result = '' 
for letter in mytext: 
    if letter not in vowels: 
     result += letter 

print(result) 
+0

Upvote 질문에 대답하지만 정규 표현식과 하위 문자열을 사용하면 약간 더 복잡한 경우 훨씬 효율적입니다. – aruisdante

+0

@aruisdante 동의 함. 하지만 제가 언급했듯이, OP는 파이썬을 배우는 것처럼 보였고 코드를 수정하는 데 도움이되고 싶었습니다. – karthikr

+0

고마워, 코드를 수정하는 또 다른 방법을 찾았지만 파이썬이 어떤 글자를 유지할지, 어떤 글자를 유지할지 결정하는 방법을 알고 싶다. 이미 이전 질문에서 설명했음을 밝힙니다. 내 검색이 충분히 철저하지는 않았습니다. – FanaHOVA

3

여기에 작동하는 방법

import re 
def anti_vowel(text): 
    return re.sub("[aeiou]+", "", text) 
+2

이것은''result + =''를 할 때마다 파이썬이 새로운 문자열을 할당해야하기 때문에 무섭다. join에 대한 입력으로 list comprehension을 사용하는 plus-equals에 대한 필요성없이 동일한 작업을 수행 할 수 있지만, 여전히 더 잘 수행 할 수 있습니다. – aruisdante

+0

그러나 문자열을 반복하는 것은 매우 멋지다! 진지하게, 가능하다면 언제든지 + =를 사용하지 말라고 충고 하시겠습니까? – zlr

+0

문자열로, 예. 파이썬 최적화에 대한 어딘가에 PEP가 있으며 문자열에 대한''+ =''(''+'')는 낮은 매달린 과일 최적화 중 하나입니다. 둘 다''join''과''format''을 적절하게 사용하여 대체 할 수 있습니다. – aruisdante

4

목표를 제거 모음 원래 캐릭터와 동일한 문자열을 반환하는 경우

이 시도 :
관련 문제