2016-10-11 8 views
0

私はこのPythonコードを取得して、単語に関連する句読点を取り除き、ユニークな単語を数えようとしています。何らかの理由でそれはまだ「こんにちは」と数えています。と "こんにちは"。どんな助けでも大歓迎です。繰り返しでリスト項目を変更するPython

def word_distribution(words): 
      word_dict = {} 
      words = words.lower() 
      words = words.split() 
      for word in words: 
       if ord('a') <= ord(word[-1]) <= ord('z'): 
        pass 
       elif ord('A') <= ord(word[-1]) <= ord('Z'): 
        pass 
       else: 
        word[:-1] 
      word_dict = {word:words.count(word)+1 for word in set(words)} 
      return(word_dict) 
+0

問題はそれよりも深いですが、まず、'ワードどんな影響を与えます変数には割り当てられません。 – Efferalgan

+0

私はx = 'Hello My Name Is hello'を使用しています。 私は関数 - > {'hello':2、 'is':1、 'my':1、 'name':1}からこれを取得しようとしています。 – BRose

+0

正直なところ、句読点を削除し、この投稿からソリューションを使用してください:http://stackoverflow.com/questions/265960/best-way-to-strip-punctuation-from-a-string-in-python 単語を数えるには、カウンタークラス:https://docs.python.org/2/library/collections.html#collections.Counter –

答えて

1

確かにあなたがしようとしていることを達成するより良い方法がありますが、この答えはあなたのコードを修正します。

文字列は不変であり、リストは変更可能です。あなたのコードのどこにもリストを変更していませんでした。 [: - 1] `だけでは何もしない、ので、あなたは再びそれを割り当て、文字列なかったためとwords[-1]は文句を言わない不変です

def word_distribution(words): 
     word_dict = {} 
     words = words.lower() 
     words = words.split() 
     for word in words: 
      index = words.index(word) 
      if ord('a') <= ord(word[-1]) <= ord('z'): 
       pass 
      elif ord('A') <= ord(word[-1]) <= ord('Z'): 
       pass 
      else: 
       word = word[:-1] 
       words[index] = word 

     word_dict = {word:words.count(word) for word in set(words)} 
     return(word_dict) 
+0

サウラブいただきありがとうございました!私はインデックスを作成していませんでした。本当に皆の助けに感謝します! – BRose

+0

@BRoseこれはあなたの答えとしてこれを受け入れることができます:) –

1

なぜ私はカウントに1を追加するのかわかりません。

def word_distribution(words): 
     word_dict = {} 
     words = words.lower().split() 
     for word in words: 
      if ord('a') <= ord(word[-1]) <= ord('z'): 
       pass 
      elif ord('A') <= ord(word[-1]) <= ord('Z'): 
       pass 
     word_dict = {word:words.count(word) for word in set(words)} 
     return(word_dict) 

{ 'ハロー':2 '私':1、 '名称' 1 'である':1}

編集:

brianpckとしては、指摘:

def word_distribution(words): 
     word_dict = {} 
     words = words.lower().split() 
     word_dict = {word:words.count(word) for word in set(words)} 
     return(word_dict) 

でも同じ結果が得られます。

+0

なぜforループを実行して各ブランチを渡していますか?また、これは正確に 'this!= this.'の句読点を扱わないでしょう。 – brianpck

+0

探していた結果のためにコードを修正しました。 – tgikal

1

あなたはSohierのデーンは、コメントで述べたように、あなたが句読点を削除し、にスクリプトを簡素化するために、他のポストを利用することができ、それはあまりにも複雑作っている:

import string 
def word_distribution(words): 
    words = words.translate(None, string.punctuation).lower() 
    d = {} 
    for w in words.split(): 
     if w not in d.keys(): 
      d[w] = 1 
     else: 
      d[w] += 1 
    return d 

結果:

>>> x='Hello My Name Is hello.' 
>>> print word_distribution(x) 
>>> {'is': 1, 'my': 1, 'hello': 2, 'name': 1} 
関連する問題