-4

文字列のリストを受け取り、そのリスト内の個別の単語の int 数を int の形式で返す関数 count_words() を作成する必要があります。リストは次のようになります。

List = ['twas', 'brillig', 'and', 'the', 'slithy', 'toves', 'did', 'gyre',
        'and', 'gimble', 'in', 'the', 'wabe', 'all', 'mimsy']

私はこのコードを使ってそれをやってみました:

def count_words(url): #this is the first line of the code but it was not included with the lines below for some reason.

    mylist = function(url)  #the function function(url) reads through the url and returns all words from the website in a list of strings. 
    counts = 0
    for i in mylist:
        if i not in mylist:
            counts = counts + 1
        else:
            continue
        return counts

ここから、私は何をすべきかわかりません。「for i in mylist」という行でエラーが発生し、修正方法がわかりません。私はまだ初心者なので、非常に基本的な答えで十分です。コード全体を変更する必要があるかどうかは気にしません。私が変更できない唯一のものは、「mylist = function(url)」行です。その部分が機能し、それを含める必要があるためです。

私が返すエラーは次のとおりです。

 Traceback (most recent call last):
    File "<web session>", line 1, in <module>
    File "/home/karanyos/foc/proj1-karanyos/karanyos.py", line 24, in count_words
       for i in mylist:
 TypeError: 'NoneType' object is not iterable

前もって感謝します、

キーリー

4

4 に答える 4

3

ヒント: モジュールを使用collectionsます。

コードに関しては、スタイルやその他の問題に関するいくつかの追加のヒント:

  • function関数の名前として単語を使用しないでください。functionは「特別な」単語であり、それを昔ながらの関数名として使用すると、その特別な意味が薄れます。
  • ループ変数に1 文字の名前 ( ) を使用しないでくださいi** - わかりやすい名前を使用してください。こちらfor word in mylist:が適当でしょう。
  • コードに論理エラーがあります -wordリストに a が表示される場合、定義によりword in list == True. したがってcounter、ゼロを超えることはありません。

** 補足: 一文字の変数名は、変数が何を意味するか、または何を含むべきかについての情報を提供しないため、不適切なスタイルです。私は個人的nm、 、pijk数学コードで許容されるループ変数名であると考えていますn,m,p i,j,k。これは歴史的な理由によるものです。


論理エラーを見つけるためのヒント:

# Relevant part of your code
my_list = ['a','b','c','d']
for item in my_list:
    if item in my_list:
        print "item %s in list" % item
    else:
        print "item %s not in list" % item

出力は次のとおりです。

item a in list
item b in list
item c in list
item d in list

これは、上記のコードがトートロジーであるためです。リストから値を取得すると、その値がそのリストに含まれているかどうかをすぐに尋ねます。答えは常に「はい」になります。

これは実際にはあなたが望んでいた論理テストではありません。あなたが本当にやりたいことは、すでに見た単語を追跡することです。すでに見た単語を追跡する方法が必要かもしれません。それとも、あなたが見たすべてのユニークな単語を追跡する魔法のようなコードが必要ですか? (ヒント:collectionsモジュールを見てください。)

一般的に言えば、デバッガーの使用方法を学ぶことも役に立ちます。これにより、実行中のプログラムの中間状態を確認できます。Spyderは、デバッガーが統合された Python IDE pdb(および他の多くの優れた機能) です。チェックしてみてください。


編集 4:collectionsモジュールを使用してみたことを述べています。-しかし、「を返す必要があるため、出力は不適切でしたint」.

これについて黙想してください:

>>> import collections
>>> my_string = "abc aabc ccab a acbbbaa"
>>> my_counter = collections.Counter(my_string)
>>> my_counter
Counter({'a': 8, 'b': 6, 'c': 5, ' ': 4}) 
>>> my_counter.keys() # Get a list of unique things in the counter
['a', ' ', 'c', 'b']
>>> 

リストに含まれる物の数を確認する方法を知っていますか?

ヒント 2:オブジェクトを呼び出すことで、オブジェクトの属性を確認できますdir()。オブジェクトに対して何を行うことが許可されているか、またはオブジェクトに対して呼び出すことができるメソッドがわからない場合は、次のようにして確認してください。

>>> dir(my_counter)
['__add__', '__and__', '__class__', '__cmp__', '__contains__', '__delattr__',
 '__delitem__', '__dict__', '__doc__', '__eq__', '__format__', '__ge__',
 '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__',
 '__iter__', '__le__', '__len__', '__lt__', '__missing__', '__module__',
 '__ne__', '__new__', '__or__', '__reduce__', '__reduce_ex__', '__repr__',
 '__setattr__', '__setitem__', '__sizeof__', '__str__', '__sub__',
 '__subclasshook__', '__weakref__', 'clear', 'copy', 'elements', 'fromkeys',
 'get', 'has_key', 'items', 'iteritems', 'iterkeys', 'itervalues', 'keys',
 'most_common', 'pop', 'popitem', 'setdefault', 'subtract', 'update', 'values',
 'viewitems', 'viewkeys', 'viewvalues']
于 2012-04-10T11:38:56.863 に答える
2

(1)collectionsライブラリには、まさにこれを可能にするクラスがあります。

(2) この機能を自分で実装したい場合は、 を使用しset、そのlen.

于 2012-04-10T11:36:21.043 に答える
1

基本に立ち返って、

IDE (たとえば IDLE) を使用している場合は、コードをデバッグする方法を学びます。pdbを使用して手を汚すことができます

単純なステートメントでログを記録するだけでprint、根本原因を突き止めることができる場合があります。

  1. 呼び出し直後の変数 mylist の値は何ですかfunction(url)
  2. エラーメッセージは何を示していますか? のようなものが見えますTypeError: 'NoneType' object is not iterableか?

あなたの問題を解決します。他の言語から来た人々は、Python が提供するデータ構造とライブラリに慣れていないことはめったにありません。

重複リストから一意の項目リストを生成するsetと呼ばれるものがあることをご存知ですか? オブジェクトの長さを返すPython 組み込み関数lenがあることをご存知ですか?

それでも問題が発生する場合は、これを実行してください。最初からやり直してくださいPython の非公式な紹介

于 2012-04-10T12:01:11.403 に答える
0
import collections

collections.Counter(['twas', 'brillig', 'and', 'the', 'slithy', 'toves', 'did', 'gyre', 'and', 'gimble', 'in', 'the', 'wabe', 'all', 'mimsy'])

これは戻ります

s = Counter({'and': 2, 'the': 2, 'slithy': 1, 'brillig': 1, 'gyre': 1, 'gimble': 1, 'did': 1, 'in': 1, 'all': 1, 'toves': 1, 'mimsy': 1, 'twas': 1, 'wabe': 1})

ここから簡単に結果を取得できます

>>> count = 0 
>>> for a in s:
...     if s[a] == 1:
...         count = count + 1
>>> print count
于 2012-04-10T11:44:51.397 に答える