2

次の方法で単語をデコードする関数を作成したいと思います。最初の母音は最後の母音と交換し、2番目は最後から2番目と交換します。子音についても同じことをしたいと思います。最後に、デコードされた単語を返します。

これは、母音を含む私のコードの始まりです:

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

問題は、この手紙を交換する方法がわからないことです。

例: 「saturday」という単語が与えられた場合、関数によって「dyratsua」が返されます

4

2 に答える 2

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]
于 2012-12-11T07:01:12.950 に答える
1

これは、母音で目的を達成する方法の 1 つです (少し複雑ですが、他の誰かがより良い方法を持っているでしょう)。それが行うことは、最初に単語 ( w) からリストを作成することです。その理由は、リストが変更可能であり、反復中に変更できるからです。リストには、すべての母音のvowelsインデックス位置が保持されます。これcutoffは奇妙な部分ですzipvowelリスト自体を逆にすると、次のようになります。

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

切り替えたいもののインデックス位置がありますが、中央のタプルの後でわかるように、文字を元に戻すだけです。したがって、ped リスト全体を使用したくないことを示す必要がある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'
于 2012-12-11T06:47:39.697 に答える