Подсчет чисел в виде строки в Python

#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 сделали?