2014-02-05 48 views
5

我敢肯定我的代碼是正確的,但它似乎並沒有返回預期的輸出結果中:正確的代碼從一個字符串中刪除元音在Python

輸入anti_vowel("Hey look words") - >輸出:"Hey lk wrds"

顯然它不能在'e'上工作,任何人都可以解釋爲什麼?

def anti_vowel(c): 
    newstr = "" 
    vowels = ('a', 'e', 'i', 'o', 'u') 
    for x in c.lower(): 
     if x in vowels: 
      newstr = c.replace(x, "")   
    return newstr 

回答

9

功能str.replace(old, new[, max])不改變c字符串本身(與你調用c)只是返回一個新的字符串,舊的出現已被新的替換。所以newstr只包含一個字符串替換爲最後一個元音c字符串是o,因此您得到的"Hey lk wrds""Hey look words".replace('o', '')相同。

我想你可以簡單地寫anti_vowel(c)爲:

''.join([l for l in c if l not in vowels]); 

什麼我做的是遍歷字符串,如果字母是不是元音則僅包含到列表(過濾器)。過濾之後,我以字符串的形式返回列表。

+1

它不應該是'[如果L不是元音l對於升的C]'? – IanAuld

+0

@lanAuld謝謝更正。 –

+0

您可以忽略[]並使用隱式生成器而不是此中間列表。 –

4

你應該這樣做:

初始化newstrc,然後

for x in c.lower(): 
    if x in vowels: 
     newstr = newstr.replace(x, "") 

這是因爲str.replace(old, new[, max])替換字符後返回字符串的副本:

方法replace()返回字符串的一個副本 發生的舊版本已被替換爲新版本,可選地限制 替換爲最大版本的次數。

所以,這是正確的代碼:

def anti_vowel(c): 
    newstr = c 
    vowels = ('a', 'e', 'i', 'o', 'u') 
    for x in c.lower(): 
     if x in vowels: 
      newstr = newstr.replace(x,"") 

    return newstr 

你也可以做一個更Python的方式:

''.join([x for x in c if x not in vowels]) 
7

你爲什麼不用正則表達式來做呢?按照documentation,這樣的事情應該工作:

import re 

def anti_wovel(s): 
    result = re.sub(r'[AEIOU]', '', s, flags=re.IGNORECASE) 
    return result 

如果您使用的功能的時候,你可以編譯正則表達式,並使用編譯版本。

+3

這看起來像是最好的方法給我(僅因爲投票的異議而發表評論) – Jonathan

2
vowels = ('a', 'e', 'i', 'o', 'u', 'A', 'I', 'E', 'O', 'U') 

for char in text: 

    if char in vowels: 

     text = text.replace(char, '') 

return text 
3

另一種選擇是放棄元音變量,並把字符刪除在循環中。

def anti_vowel(text): 
     for i in "aeiouAEIOU": 
      text = text.replace(i,"") 
     return text 

    print anti_vowel("HappIEAOy") 
5

Try String.translate。

>>> "Hey look words".translate(None, 'aeiouAEIOU') 
'Hy lk wrds' 

string。translate(s,table [,deletechars])

從s中刪除所有位於deletechars中的字符(如果存在),然後使用表格翻譯字符,該表格必須是一個256個字符的字符串,給出每個字符的翻譯價值,由它的序數索引。如果表格是None,那麼只執行字符刪除步驟。

https://docs.python.org/2/library/string.html#string.Template.substitute

或者,如果您使用的是新奇的Python 3:

>>> table = str.maketrans(dict.fromkeys('aeiouAEIOU')) 
>>> "Hey look words.translate(table) 
'Hy lk wrds' 
+1

這是我認爲的最佳方式,我更願意使用語言提供的工具來編寫新的工具。 –

+0

不錯,但這在Python3中不起作用。 ''test'.translate(str.maketrans('aeiouAEIOU',' - '* 10))'產生't-st',但不能在Python中替換爲None 3 – Wes

+0

已針對Python 3進行了更新。更尷尬。 –

1

還有一個更簡單的方法可以從字符串中提取非元音字符,並將其送回。

def anti_vowel(text): 
    newstring="" 
    for i in text: 
     if i not in "aeiouAEIOU": 
      newstring=newstring+i 
    text=newstring 
    return text 
+0

有一點,你可以返回newstring而不是文本 – Paddy

1
def anti_vowel(text): 
new=[] 
vowels = ("aeiouAEIOU") 
for i in text: 
    if i not in vowels: 
     new.append(i) 
return ''.join(new) 

我希望這有助於..

0

我知道有關於這個主題的許多正確的解決方案,但我想補充解決這一問題的一些有趣的方式。 如果您來自C++/C#或Java,您將傾向於使用類似比較的操作,然後使用索引執行操作以刪除for循環中的不需要的條目。 Python具有刪除和刪除功能。刪除功能使用數值和 刪除使用索引。pythonic解決方案在最後的功能。讓我們看看我們如何能做到這一點:

這裏我們使用for循環的索引和刪除功能在C++非常相似:

def remove_vol(str1): 
    #list2 = list1 # this won't work bc list1 is the same as list2 meaning same container# 
    list1 = list(str1) 
    list2 = list(str1) 
    for i in range(len(list1)): 
     if list1[i] in volwes: 
      vol = list1[i] 
      x = list2.index(vol) 
      del list2[x] 
    print(list2) 

使用刪除功能:

def remove_vol(str1): 
     list1 = list(str1) 
     list2 = list(str1) 
     for i in list1: 
      if i in volwes: 
       list2.remove(i) 
     print(list2) 

使用索引構建不包含不需要的字符的新字符串:

def remove_vol(str1): 
    list1 = list(str1) 
    clean_str = '' 
    for i in range(len(list1)): 
     if list1[i] not in volwes: 
      clean_str += ''.join(list1[i]) 
    print(clean_str) 

一樣在上面的解決方案,但使用值:

def remove_vol(str1): 
    list1 = list(str1) 
    clean_str = '' 
    for i in list1: 
     if i not in volwes: 
      clean_str += ''.join(i) 
    print(clean_str) 

你應該怎麼做在Python?使用列表理解!它是美麗的:

def remove_vol(list1): 
    clean_str = ''.join([x for x in list1 if x.lower() not in volwes]) 
    print(clean_str) 
0

我的實現:


# Ask the user for input: 
user_input = input("enter a string with some vowels: ") 
print("input string: " + str(user_input)) 
vowels = ('a','e','i','o','u','A','E','I','O','U') 
new_string=""; 
for i in range(0,len(user_input),1): 
    if user_input[i] in vowels: 
     print ('found a vowel, removing...') 
    else: 
     new_string+=user_input[i] 
print("I've removed the vowels for you. You're welcome! The new string is: " + new_string) 
相關問題