#python #numbers #counter
#python #числа #счетчик
Вопрос:
Я новичок в Python. Я пытался подсчитать, сколько раз 1-9 появляется в списке, но python не считает число и всегда считает как 1, не добавляя дополнительного подсчета для вхождений числа 1-9. Кто-нибудь может помочь мне понять, почему?
#code
for nmb in ls:
if nmb is not ls:
frstdic[nmb] = 1
else:
frstdic[nmb] = frstdic[nmb] 1
print (frstdic)
#return
{'1': 1, '2': 1, '3': 1, '4': 1, '5': 1, '6': 1, '7': 1, '8': 1, '9': 1}
# nmb is a string
Комментарии:
1. Можете ли вы поделиться примером ввода и результатом, который вы пытаетесь получить для него?
2. Итак, вы говорите, что удивлены, что
nmb is not ls
это всегда верно?3. @ChrisCharley После этого это не имеет особого смысла
for nmb in ls:
. Плюс это недопустимый синтаксис. Python не такой разговорчивый 🙂4. Вы должны проверить
if nmb not in frstdic:
. Или еще лучше использоватьdefaultdict
.5. @превосходный дождь Да, я не очень хорошо это продумал 🙂
Ответ №1:
В вашем коде логическая ошибка (см. Комментарии). Рассмотрите возможность использования счетчика или словаря по умолчанию:
from collections import Counter, defaultdict
#1
frstdic = defaultdict(int)
for nmb in ls:
frstdic[nmb] = 1
#2
frstdic = Counter(ls)
Подход счетчика примерно в 4 раза медленнее для коротких последовательностей, но мне кажется более элегантным.
Комментарии:
1. @superbrain Даже если синтаксическая ошибка исправлена, существует также логическая ошибка/
2. «подход счетчика примерно в 4 раза медленнее» — разве подход счетчика на самом деле не быстрее?
3. @DarrylG Нет, согласно
%timeit
.4. @superbrain На самом деле, вы правы. Это просто логическая ошибка. Неважно.
5. ОК. Я подумал, может быть, вы имели в виду ошибку отступа. Что именно вы %timeit сделали?