2012-12-11 84 views
2

我想做一個函數,它將按照以下方式解碼一個單詞:第一個元音與上一個元音交換,第二個元音與第二個元音交替,等等。用輔音做。最後它會返回解碼的單詞。如何在Python中交換元音和輔音

這是我的代碼以元音開頭:

def decode(w): 
    for i in range(len(w)): 
     for j in range(len(w[::-1])): 
      if (i[0] in 'aeiouy' and j[0] in 'aeiouy'): 
       s[i],s[j]=s[j],s[i] 
    return w 

的問題是,我不知道如何來交換這個字母。

例如: 我給出一句話:「星期六」 我的功能給我「dyratsua」回來

+1

請張貼樣本輸入和期望輸出。您的描述不明確 – inspectorG4dget

+0

Python中的字符串類型是不可變的,您應該爲您的結果創建新的一個字符串,您不能更改已經創建的字符串對象。 – Denis

回答

1

這裏是你能達到你想要的元音(什麼人的方式,雖然這是一個有點錯綜複雜 - 別人會有更好的辦法)。它所做的是首先從你的單詞(w)創建一個列表,其原因是列表是可變的,因此可以在我們的迭代過程中進行修改。 vowels列表保存了所有元音的索引位置。該cutoff是怪異的一部分 - 我們將用自身的反向zipvowel名單,這將是這個樣子:

In [28]: zip(vowels, vowels[::-1]) 
Out[28]: [(1, 7), (3, 6), (6, 3), (7, 1)] 

因此,我們有什麼,我們希望切換索引位置,但作爲你可以在中間元組後面看到,我們只是將這些字母交換回來。因此,我們必須指出,我們不想使用整個zip單元列表,所以我們在中間切斷它(因爲奇數個元音將意味着中間元音將自身替換)。從那裏,你就像以前一樣做 - 交換信件,但這次你正在處理一個可變列表。最後,將所有東西一起加入到一個字符串中。

In [29]: word = 'saturday' 

In [30]: vowels = [index for index, c in enumerate(word) if c in 'aeiouy'] 

In [31]: w = [c for c in word] 

In [32]: cutoff = int(round(len(vowels)/2.0)) 

In [33]: for i1, i2 in zip(vowels, vowels[::-1])[:cutoff]: 
    ....:  w[i1], w[i2] = w[i2], w[i1] 
    ....:  
    ....:  

In [34]: ''.join(w) 
Out[34]: 'sytardua' 
5
word = 'aerodynamic' 

vowels = 'aeiouy' 

is_vowel = [x in vowels for x in word] 
word_vowels = [x for x in word if x in vowels] 
word_consonants = [x for x in word if x not in vowels] 

word_vowels.reverse() 
word_consonants.reverse() 

new_word = [word_vowels.pop(0) if x else word_consonants.pop(0) for x in is_vowel] 
+1

偉大的答案男人,+1 - 我要肉身出去,但你的明顯更好,所以我沒有看到需要:) – RocketDonkey

相關問題