【问题标题】:How to exchange vowels and consonants in Python如何在 Python 中交换元音和辅音
【发布时间】:2012-11-28 16:16:13
【问题描述】:

我想创建一个函数,它会以下列方式解码一个单词:第一个元音与最后一个元音交换,第二个与倒数第二个等交换。我想对辅音做同样的事情。最后它会返回解码后的单词。

这是我的元音代码的开头:

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”

【问题讨论】:

  • 请发布示例输入和预期输出。您的描述不明确
  • Python中的字符串类型是不可变的,你应该为你的结果创建一个新的字符串,你不能改变已经创建的字符串对象。

标签: python exchange-server decode


【解决方案1】:
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 - 我打算充实我的,但你的显然更好,所以我看不出有必要:)
【解决方案2】:

这是一种你可以用元音实现你想要的方法(虽然它有点复杂 - 其他人会有更好的方法)。它的作用是首先根据您的单词 (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'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    • 2020-08-15
    • 2018-01-14
    • 2020-05-16
    • 1970-01-01
    相关资源
    最近更新 更多