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

这是你可以用元音实现你想要的一种方法(虽然它有点复杂 - 其他人会有更好的方法)。它的作用是首先从您的单词 ( w) 创建一个列表,原因是列表是可变的,因此可以在我们的迭代过程中进行修改。该vowels列表保存所有元音的索引位置。这cutoff是一个奇怪的部分 - 我们将使用它本身的反面zip进入vowel列表,它看起来像这样:

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

所以我们有我们想要切换的索引位置,但正如你在中间元组之后看到的那样,我们只需将字母交换回来。因此我们必须表明我们不想使用整个zipped 列表,所以我们在中间将其切断(因为奇数个元音将意味着中间元音用它自己替换它自己)。从那里开始,您就像以前一样 - 交换字母,但这次您使用的是可变列表。最后,将所有内容连接成一个字符串。

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 回答