-4

我必须编写一个函数 count_words(),它接受一个字符串列表并以 int 的形式返回该列表中不同单词的 int 数量。清单如下:

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是一个“特殊”词,将其用作普通的旧函数名称会掩盖其特殊含义。
  • 不要i对循环变量使用单字母名称 ( ) ** - 使用描述性名称。这里for word in mylist:是合适的。
  • 您的代码有逻辑错误 - 如果 aword出现在列表中,根据定义word in list == True。所以counter永远不会超过零。

** 旁注:单字母变量名的风格不好,因为它们没有提供有关变量含义或它应该包含什么的信息。我个人只认为n,和m,是数学代码中可接受的循环变量名称,并且只有在以与数学家使用. 这是出于历史原因。pijkn,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是一个带有pdb调试器集成(以及许多其他不错的功能)的 Python IDE。检查一下。


编辑 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) 如果您想自己实现此功能,只需使用 a 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 回答