2016-12-06 6 views
-5

ここに質問があります:文字列内の単語の位置を見つける方法は?

次の入力と出力でwordPositions()という名前の関数を記述します。 入力:s、大文字と小文字の文字とスペースで構成される文字列。 リターン:s内の各別個の単語がキーであり、対応する値が、単語が出現するs内の位置のリストである辞書。単語は、大文字とは無関係に同じものとして扱われなければならない。つまり、「はい」と「はい」は同じ単語です。 正しい出力の例を次に示します。

s = 'One fish two fish red fish blue fish' 

wp = wordPositions(s) 

print(wp) 

{ '2':[2]、 '1':[0]、 '赤':[4]、 '魚':[1、3、5、7]、「青':[6]}

今ここに私のコードである:

def wordPositions(s): 
aDict = {} 
words = s.split(' ') 
for item in words: 
    position = words.index(item) 
    aDict[item] = position 
print(aDict) 
print(wordPositions('One fish two fish red fish blue fish')) 

問題は私の出力である:

{' 2 ':2 '' 青:6、 '赤':4 、 'fish':1、 'One':0}

教授のように見えるようにするにはどうすればよいですか?また、私の出力では、文字列で繰り返されていますが、 'fish'という単語がどのように1つの位置しか表示されていないかに注目してください。 Pythonに 'fish'の複数の位置を表示させるにはどうすればよいですか?

+0

あなたの辞書はリストを保持する必要があります。このためには、 'defaultdict'を見て、辞書項目をデフォルトでリストにすることができます。次に、 'enumerate'を使って繰り返します。 indexを(start引数を指定せずに)使用すると、コードを 'On^2'時間の複雑さを与えることは言うまでもなく、同じインデックスを見つけることができます。 –

答えて

4

単語の位置を見つけて保存するたびに、そのキーの値を上書きしています(その単語が以前に見つかった場合)。

位置値を直接辞書項目に割り当てないでください。代わりに、各辞書項目に配列を割り当てる必要があります。次に、単語の位置を見つけるたびに新しい値を配列にプッシュできます。

まず、キーが辞書に既に存在するかどうかを確認する必要があります。そうでない場合は、最初にそのキーに空の配列を代入します。次に、キーが以前に存在したかどうかに関わらず、新しい値を配列(つまりそのキーの値である配列)にプッシュします。

を編集します。position = words.index(item)は、単語の最初の出現位置を取得します。したがって、単語の位置が重複していないことを確認する必要があります(ヒント:これを行うにはforループを使用してください)。

(上記の編集を送っ@Cham K.に謝罪 - 私はそれを自動的に受け入れるように方法がわからないよ。)

編集2(TigerhawkT3コメント@ごとなど):あなたのforループで使用enumerate 。この場合に使用する方が簡単になります。 (GoogleのPythonの列挙)。

注::私は故意にここにコードを掲載していません。ちょうど(うまくいけば役立つ)指示。あなた自身のために理解しようとしているはずのもののように見えます。:-)

+1

'' enumerate'を推薦することをお勧めします。私はまた、列挙する単語についても考えてみましょう。( 'One fish 2 fish red fish blue fish.split()):print(i、word) – TigerhawkT3

+0

@ TigerhawkT3はい。文字列の各単語が常に空白で区切られていれば、それは私が取るアプローチです。 –

+1

私はあなたが冗談を言っていると思います、そして、あなたは本当に他の人にあなたの宿題をするように求めているわけではありません。 http://meta.stackexchange.com/questions/18242/what-is-the-policy-here-on-homeworkおよびhttp://meta.stackoverflow.com/questions/334822/how-do-i-を参照してください。 ask-and-answer-homework-questions –

0

はこれを試してみてください:

def wordPositions(s): 
    aDict = {} 
    words = s.split(' ') 
    for item in words: 
     aDict[item]="" 
    for i in range(0,len(words)): 
     if aDict[words[i]]=="": 
      aDict[words[i]]=str(i) 
     else: 
      aDict[words[i]] = aDict[words[i]]+","+str(i) 
    print(aDict) 
wordPositions('One fish two fish red fish blue fish') 
0

A Python的な方法は、以下の辞書理解することができます

def wordPositions(s): 
    splitted = s.split() 
    return {w: [i for i in range(len(splitted)) if splitted[i] == w] 
       for w in set(splitted)} 

としてはコメントでBallpointBenによって指摘、この解決策はより良いものではありませんそれはO(n^2)(セット上のループ内に埋め込まれたリスト上の1つのループ)であるため、複雑さの観点からです。

しかし、それは辞書とリストの両方の理解を使用するPythonicソリューションであるため、良いと思われるかもしれませんが。

教訓は、Pythonicityは良いですが、毎回ではありません。

+0

これはO(n^2)であり、最適解はO(n)であることに注意してください。 – BallpointBen

+0

@BallpointBen私はこれを知っています:)私はそれが複雑さと可読性の面で悪いと思っていますが、まだそれを行うには非常に難しい方法です。実際、私はこのような問題に対処するための理解スタイルを指摘するためにこの答えを投稿しました。 –

+0

ニース!教授がそれに従うことができるのだろうか? –

0

あなたの教授は整数の位置のリストを辞書の値として作成するように頼んでいますが、あなたのメソッドは整数だけを値として入れます。したがって、正しい方法は、ループ内に新しいリストを作成し、新しい位置が見つかった場合はそれを追加し続けることです。

関連する問題