TypeError:count()只接受一个参数

时间:2012-02-25 20:57:42

标签: python django

我是Python和Django的新手,我从教程中修改了这段代码。我加载页面时收到TypeError: count() takes exactly one argument (0 given)。我一直在进行故障排除和谷歌搜索,似乎无法搞清楚。我做错了什么?

def report(request):
    flashcard_list = []
    for flashcard in Flashcard.objects.all():
        flashcard_dict = {}
        flashcard_dict['list_object'] = flashcard_list
        flashcard_dict['words_count'] = flashcard_list.count()
        flashcard_dict['words_known'] = flashcard_list.filter(known=Yes).count()
        flashcard_dict['percent_known'] = int(float(flashcard_dict['words_known']) /    flashcard_dict['words_count'] * 100)
        flashcard_list.append(flashcard_dict)
    return render_to_response('report.html', { 'flashcard_list': flashcard_list })  

7 个答案:

答案 0 :(得分:16)

count需要一个参数。它返回列表中特定项的实例数。

>>> l = range(10) + range(10)
>>> l.count(5)
2

2这里是列表中5的数量。如果您想要列表的长度,请使用len

>>> len(l)
20

答案 1 :(得分:4)

你在这里尝试做什么并不是很清楚。 flashcard_list是一个(空)列表,您在循环之前定义它。在它上面调用Django查询集函数如countfilter是没有意义的(有一个名为count的列表方法,但正如错误所说,它需要一个参数,并计算数量在列表中找到该参数的时间。)

您的意思是使用flashcard.count()吗?这仍然没有意义,因为闪存卡是单个Flashcard实例,而不是查询集。你需要更准确地解释一下你希望做什么。

评论后修改是的,所以我认为问题在于你是在尝试在循环中完成所有这些操作,因为某些原因,迭代每个Flashcard。事实上,我认为你根本不想要循环。这样的事情会更好:

def report(request):
    flashcard_dict = {}
    flashcards = Flashcard.objects.all():
    flashcard_dict['list_object'] = flashcards
    flashcard_dict['words_count'] = flashcards.count()
    flashcard_dict['words_known'] = flashcards.filter(known=True).count()
    flashcard_dict['percent_known'] = int(float(flashcard_dict['words_known']) /    flashcard_dict['words_count'] * 100)
    return render_to_response('report.html', flashcard_dict)

在这里,您可以看到您正在操作所有闪存卡的查询集,而不是空列表。而且你正在建立一个字典,而不是字典列表,而且字典本身就成了模板上下文 - 所以在模板中你可以引用{{ words_count }}等。

答案 2 :(得分:4)

count()查找项目在列表中出现的次数,因此需要该项目作为参数。我想你在寻找列表中的项目数量。对于此用途,len()不是count()

flashcard_dict['words_count'] = len(flashcard_list)
flashcard_dict['words_known'] = len(flashcard_list.filter(known=Yes))

count()的一个例子是

flashcard_dict['dog_count'] =flashcard_list.count('dog')

答案 3 :(得分:0)

你需要给count(x)提供一些论据。

  

它返回x出现在列表中的次数。

>>> mylist  = [1,2,3,2]
>>> mylist.count(2)
2
>>> mylist.count()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: count() takes exactly one argument (0 given)
>>>

很难理解您要实现的目标flashcard_list列表是空的。因此,在调用count之前,您需要在列表中添加一些内容。

答案 4 :(得分:0)

alist = []
alist.append('a')
alist.count('a')
1

这将计算列表中的所有“a”。

答案 5 :(得分:0)

count方法并不是您想要的。在Python列表中,list.count(x)会告诉您xlist的出现次数。你想要len(flashcard_list)。函数len是一个内置函数,它将告诉你许多Python对象类型的长度。

答案 6 :(得分:0)

列表的count方法计算x在列表中显示的次数。查看文档here

如果您想知道列表中的项目数量,您需要使用len()

>>> a = ['a', 'b', 'c']
>>> print len(a)
3