现在,我正在尝试创建一个oppish翻译器。也就是说,在连续一个辅音或多个辅音之后,您可以在这些字母后添加“ op”。举例来说,母牛会变成小矮人或街头小贩。这是我到目前为止的内容:

def oppish(phrase): #with this function I'm going to append 'op' or 'Op' to a string.
    consonants =  ['b','c','d','f','g','h','i','j','k','l','m','n','p','q','r','s','t','v','w','x','y','z']
    vowels = ['a', 'e', 'i', 'o', 'u'] #this and the preceding line create a variable for the vowels we will be looking to append 'op' to.
    if phrase == '':    #error case. if the input is nothing then the program will return False.
        return False
    phrase_List = list(' ' + phrase) # turns the input phrase into a list which allows for an        index to search for consonants later on.
    new_phrase_List = list() #creates new list for oppish translation
    for i in range(1, len(phrase_List)):
        if phrase_List[i] == phrase_List[1]:
            new_phrase_List.append(phrase_List[i])
        elif phrase_List[i] in consonants:
            new_phrase_List.append('op') #adds op to the end of a consonant within the list and then appends it to the newlist
        new_phrase_List.append(phrase_List[i]) #if the indexed letter is not a consonant it is appended to the new_phrase_list.
    print 'Translation: ' + ''.join(new_phrase_List)

oppish('street')


唯一的问题是上面的代码产生了

Translation: ssoptopreeopt


我不确定自己做错了什么,我尝试过使用展示台,但无济于事。感谢所有帮助! :)

最佳答案

这非常适合itertools.groupby,它将使您可以使用键功能将项目归为一组。该组将累积,直到键函数的返回值更改为止,此时group by将产生键函数的返回值,并在累积的组上进行迭代。在这种情况下,如果字母是元音,我们希望我们的键函数返回True。这样,我们将从groupby中获得一组连续的辅音和一组连续的元音:

from itertools import groupby

vowels = {'a', 'e', 'i', 'o', 'u'}  # set instead of list, because lookups are O(1)

def oppish(phrase):
    if not phrase:
        return False

    out  = []
    for is_vowel, letters in groupby(phrase, lambda x: x in vowels):
        out.append(''.join(list(letters)))
        if not is_vowel:
            out.append('op')
    return ''.join(out)


print oppish('street')
print oppish('cow')


输出:

stropeetop
copowop

10-08 14:16