TypeError: count () принимает ровно один аргумент - PullRequest
10 голосов
/ 26 февраля 2012

Я новичок в 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 ]

16 голосов
/ 26 февраля 2012

count требует аргумента. Возвращает количество экземпляров определенного элемента в списке.

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

2 здесь число 5 с в списке. Если вы хотите длину списка, используйте len.

>>> len(l)
20
4 голосов
/ 26 февраля 2012

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')
4 голосов
/ 26 февраля 2012

Не совсем понятно, что вы пытаетесь сделать здесь. flashcard_list - это (пустой) список, который вы определяете перед циклом. Не имеет смысла вызывать функции набора запросов Django, такие как count и filter для него (есть метод списка с именем 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 }} и т. Д.

0 голосов
/ 26 февраля 2012

Метод count списка подсчитывает, сколько раз x появляется в списке.Проверьте документ здесь .

Если вы хотите узнать количество предметов в списке, которое вам нужно использовать len()

>>> a = ['a', 'b', 'c']
>>> print len(a)
3
0 голосов
/ 26 февраля 2012

Метод count не совсем то, что вы ищете.В списках Python list.count(x) сообщает, сколько вхождений x содержится в list.Вы хотите len(flashcard_list).Функция len - это встроенная функция, которая сообщит вам длину ряда типов объектов Python.

0 голосов
/ 26 февраля 2012
alist = []
alist.append('a')
alist.count('a')
1

Это будет считать все «а» в вашем списке.

0 голосов
/ 26 февраля 2012

Вам необходимо указать аргумент для 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 необходимо добавить что-то в список.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...