2016-06-24 7 views
-7

私は非常にPythonに新しく、コードワーアを試しています。いくつかの問題はかなり難しいです。私が達成しようとしていることは、「与えられた単語の母音のインデックスを知るために、例えば、スーパーという単語に2つの母音があります(2番目と4番目の文字)。私は実際にどのようにインデックスを使用して、および/または見つけることを理解していない。このコードを編集して、任意の単語の母音の位置を見つけることができるかどうかを知る必要があります。誰かがstr.indexとstr.findの使い方を説明し、次のコードが間違っている理由を教えてください。

def vowel_indices(word): 
    word.index("a","i","o","u","e","y") 
    word.find("a","i","o","u","e","y") 
+1

このコードは実行されません。あなたは何をすることを期待していますか(印刷、返却)? – handle

+0

私はそれを母音の位置を返すようにしようとしていました。私はそれが完全ではないことを知っている私はちょうど次に何をするかについて混乱しています。 –

+1

はい、コードはエラーメッセージを生成します。あなたはそれらのメッセージを述べたり、質問したりしません。彼らはあなたの問題を解決するのに役立つ "間違った"情報よりもずっと多くの情報を提供します。関数を間違って使用します。ドキュメンテーションでは、doと使用方法を正確に説明しています。彼らは 'word'を探すために一つの引数を取るだけです。あなたはその出力を使用しません。私の答えを見て、それを受け入れてください。 – handle

答えて

0

マニュアルを参照してください

方法の周りにあなたのコードをビルドします。

# characters to look for in a list (string would work as well) 
vowels = ["a","i","o","u","e","y"] 

# a function (method) 
def vowel_indices(word): 
    # prepare empty list to collect the positions in 
    hits = [] 

    # test every of your vowels 
    for vowel in vowels: 
     # the function returns the index of vowel in word or -1 if it's not there 
     pos = word.find(vowel) 

     # test for match 
     if pos>0: 
      # collect match in list 
      hits.append(pos) 

    # done, return the list 
    return hits 

# the string to analyse 
word = "super" 

# pass the string to the method and get its return value 
results = vowel_indices(word) 

# output the return value 
print(results) 

出力:

[1, 3] 

これは本当にリストオブジェクトですが、Pythonはその要素を出力します。


@PM 2Ringで指摘されているように、これは文字列中の母音の最初の出現箇所のみを見つけます。これは、2つの理由からです:

戻るところ、文字列内の最小インデックス:

  1. 各母音が一度だけ
  2. str.find()テストされているのみ(RFINDも参照())左端の一致を検出部分文字列subは、スライスs [start:end]内にあります。

それを動作させるために、次のようにだから私は無駄にコードを複雑:

# characters to look for in a list (string would work as well) 
vowels = ["a","i","o","u","e","y"] 

# a function (method) 
def vowel_indices(word): 
    # prepare empty list to collect the positions in 
    hits = [] 
    # test every of your vowels 
    for vowel in vowels: 
     # work on a copy 
     temp = word 
     # look first, give up later 
     while True: 
      # the function returns the index of vowel in word or -1 if it's not there 
      pos = temp.lower().find(vowel) 
      # test for match 
      if pos>0: 
       # collect match in list 
       hits.append(pos) 
       # remove matched vowel from 
       temp = temp[:pos] + " " + temp[pos+1:] 
       print(temp) 
      else: 
       break 

    # done, return the list 
    return hits 

# the string to analyse 
word = "Banana!" 

# pass the string to the method and get its return value 
results = vowel_indices(word) 

# output the return value 
print(results) 

出力

B nana! 
B n na! 
B n n ! 
[1, 3, 5] 
+3

これは機能しますが、むしろ非効率です。 –

+0

はい、わかりやすいです。しかし、私は大文字を説明できませんでしたので、 'word.lower()。find(母音)'を使用してください。 – handle

+0

1.35 s vs. 0.93 s – handle

1

str.index:よう

S.find()が、部分文字列が見つからなかった場合ValueErrorを送出し。

与えられた単語の母音を見つけるには、あなたの質問ですでに言及したように1つの音符を取る必要がありますが、いくつかの母音は複数の母音(すなわち "列挙")を持つことができます。それらに対処:

def vowel_indices(word): 
    v = ["a","e","u",...] 
    for index, letter in enumerate(word): 
     if letter in v: 
      print("Vowel letter %s, index of [%s]" % (letter, index)) 

またマニュアルをCommon string operations

Examples for string find in Python

Python String index() Method

を参照してください。

How to get the position of a character in Python?

+1

'in'テストは、文字列' aeiouy ': 'にも対応しますが、母音のセットに対してテストするのが少し速くなります。 –

4

あなたはそのようなstr.findまたはstr.indexを呼び出すことはありません。これらは両方とも、彼らはおそらく、続いて検索を開始する場所をターゲット文字列で指定するには、おそらく開始インデックスに続いて、検索するために単一部分文字列を取ることを意味フォーム

(sub[, start[, end]]) 

の引数を(取ります検索を停止する場所を指定します。

しかし、これは実際には.findまたは.indexの仕事ではありません。これらの方法はどちらも、検索する文字列に対して線形スキャンを行い、すべての母音をループしなければならないすべての母音を見つける必要があります。

幸いにも、Pythonはより効率的な方法を提供します:母音をセットに入れて、単語の文字をループし、各文字が母音セットに含まれているかどうかをテストします。テストセットのメンバーシップは非常に効率的で、セット全体にわたってリニアスキャンは必要ありません。すべての母音をキャッチするには、大文字の小文字の母音である大文字の&をセットに入れる必要があります。単語の各母音の位置を追跡するために、enumerate機能を使用することができます。

vowels = set("AEIOUYaeiouy") 
def vowel_indices(word): 
    return [i for i, c in enumerate(word) if c in vowels] 

# Test 
for word in ("super", "AMAZING"): 
    print(word, vowel_indices(word)) 

出力

super [1, 3] 
AMAZING [0, 2, 4] 
+0

文字列の代わりに 'set'を使用すると、関数の名前が変更され、' timeit(https://docs.python.org/3/library/timeit.html#examples)で 'print(timeit.timeit ( "test( 'Banana!')、setup =" from __main__ import test "))' – handle

関連する問題