3

この小さな問題に数日座っていたのですが、それがすべて間違っているのか、それとも何かを見逃しただけなのかはわかりません。

目的:文の各単語から-最初の母音を見つけ、その母音の後の文字を単語から削除し、残りの文字に3を掛けます。

例:「HelloWorld」という文がある場合、必要な出力は「HeHeHeWoWoWo」になります。

私のコード:

def bebis(inrad):
    utrad = ""
    inrad = inrad.split()
    for tkn in inrad:
        for tkn1 in tkn: #Eftersom tkn ar ordlista nu.
            if tkn1 in vokaler:
                count = len(tkn1)
                utrad += tkn1
            elif tkn1 in konsonanter:
                utrad += tkn1
    return utrad[:count+1]*3

print("Bebisspraket:",bebis(inrad))

私の考え: split()を使用して文を単語のリストに分割しました。次に、2つのforループを使用します。1つは各単語を通過する必要があり、もう1つはすべての単語の各文字を通過する必要があります。母音が見つかった場合は、その場所を数えて、単語の最初の母音に文字を戻します。

私の問題:出力は文の最初の単語だけを与え、そこから途切れます。したがって、「HelloWorld」は「HeHeHe」を生成し、私を非常に苛立たせます。なぜそれは文の残りを通過しないのですか?

4

3 に答える 3

4

このようなものはどうですか:

import re

def bebis_word(word):
    first_vowel = re.search("[aeiou]", word, re.IGNORECASE)

    if first_vowel:
        return word[0:first_vowel.start() + 1] * 3
    else:
        return ''    

def bebis(sentence):
    words = [bebis_word(word) for word in sentence.split()]

    return " ".join(words)

print bebis("Hello World")

出力:

HeHeHe WoWoWo

于 2012-09-22T14:06:50.243 に答える
0

正規表現アプローチの代替として、私は次のことを行いました。

def find_vowel_index(word):
    vows = set(["a", "e", "i", "o", "u"])
    for i, letter in enumerate(word):
            if letter in vows:
                    return i
    return -1 

def bebis(s, repeat=3):
    return " ".join([word[0:find_vowel_index(word)+1] * repeat for word in s.split() if find_vowel_index(word) >= 0])

考え:

  • セットの「イン」テストは一定時間の操作であるため、母音のセットを行いました(O(1))
  • オプションの繰り返し引数を bebis に追加したので、単語を 3 回以外の回数繰り返したい場合は簡単に実行できます。
  • find_vowel_indexinへの複数回の呼び出しは好きではありませんbebis。より適切に構造化できます。
  • 正規表現バージョンとのトレードオフは、単語が長くなるにつれて遅くなるということです (そして、単語の母音が「深く」なります)。OTOH、短い言葉では、正規表現のオーバーヘッドは少しコストがかかるかもしれないと思います。
于 2012-09-22T14:48:27.807 に答える
0

あなたのアプローチは正しいようです(文を単語に分割し、単語を繰り返して最初の母音を見つけます)。

問題は、tkn1変数が文字であるため、len(tkn1)常に 1 であることです。so count=1

考えられる解決策は次のとおりです。

def bebis(inrad):
    utrad = ""
    inrad = inrad.split()
    # Loop on words 
    for tkn in inrad:
        # Loop on letters in the word
        for (i,tkn1) in enumerate(tkn): #Eftersom tkn ar ordlista nu.
            if tkn1 in vokaler:
                utrad += tkn[:i+1] * 3
                break
        utrad += " "
    return utrad

ここではenumerate、タプルのリストを与える関数を使用します(index,letter)。現在の文字が母音であることをテストしたら、単語の最初の文字 ( tkn[:i+1]) を取得し、それらを 3 回繰り返して格納しutrad、次の単語に移動します (break現在のループを終了するステートメントを使用)。単語間に余分なスペースを追加するだけです。

于 2012-09-22T13:59:54.813 に答える