python находит самый посещаемый месяц

#regex #string

#регулярное выражение #строка

Вопрос:

Я пытаюсь узнать октябрь (упоминается 2 раза), у меня возникла идея использовать dictionary для решения этой проблемы. Однако я много боролся, чтобы выяснить, как найти / разделить месяцы, я не смог использовать свое решение для значений 1st str, где есть некоторые пробелы. Может кто-нибудь, пожалуйста, подсказать, как я могу изменить этот раздел разделения, чтобы покрыть — и пробел?

  import re
    #str="May-29-1990, Oct-18-1980 ,Sept-1-1980, Oct-2-1990"

    str="May-29-1990,Oct-18-1980,Sept-1-1980,Oct-2-1990"

    val=re.split(',',str)

    monthList=[]
    myDictionary={}

    #put the months in a list
    def sep_month():
        for item in val:
            if not item.isdigit():
                month,day,year=item.split("-")

            monthList.append(month)

#process the month list from above
    def count_month():
        for item in monthList:
            if item not in myDictionary.keys():
                myDictionary[item]=1
            else:
                myDictionary[item]=myDictionary.get(item) 1

        for k,v in myDictionary.items():
            if v==2:
                print(k)

    sep_month()
    count_month()
  

Ответ №1:

 from datetime import datetime
import calendar
from collections import Counter

datesString = "May-29-1990,Oct-18-1980,Sep-1-1980,Oct-2-1990"
datesListString = datesString.split(",")

datesList = []
for dateStr in datesListString:
    datesList.append(datetime.strptime(dateStr, '%b-%d-%Y'))

monthsOccurrencies = Counter((calendar.month_name[date.month] for date in datesList))

print(monthsOccurrencies)
# Counter({'October': 2, 'May': 1, 'September': 1})
  

Что следует знать в моем решении с %b для месяца, так это то, что оно Sept изменилось на Sep для работы (месяц как сокращенное название локали). В этом случае вы можете использовать либо полное название месяца (%B), либо сокращенное название (%b). Если вы не можете использовать большую строку с правильным форматированием названия месяца, просто замените неправильные («Sept», например, на «Sep» и всегда работайте с date obj).

Комментарии:

1. Спасибо, я не думал использовать параметр datetime. Я буду экспериментировать с этим.

2. Я предлагаю использовать datetime.strptime вместо пользовательского решения, зациклив значение strings и обрезав или разделив строку, поскольку в будущем ваши данные могут измениться, и в этом случае вам придется удалить свою пользовательскую реализацию и создать новую реализацию. Между тем, с помощью datetime.strptime функции вы просто меняете формат шаблона даты и можете повторно использовать тот же код

Ответ №2:

Не уверен, что regex — лучший инструмент для этой работы, я бы просто использовал strip() вместе с split() для решения ваших проблем с пробелами и получения списка сокращений только за месяц. Затем вы могли бы создать dict с подсчетами по месяцам, используя метод list count() . Например:

 dates = 'May-29-1990, Oct-18-1980 ,Sept-1-1980, Oct-2-1990'

months = [d.split('-')[0].strip() for d in dates.split(',')]
month_counts = {m: months.count(m) for m in set(months)}

print(month_counts)
# {'May': 1, 'Oct': 2, 'Sept': 1}
  

Или даже лучше с collections.Counter :

 from collections import Counter

dates = 'May-29-1990, Oct-18-1980 ,Sept-1-1980, Oct-2-1990'

months = [d.split('-')[0].strip() for d in dates.split(',')]
month_counts = Counter(months)

print(month_counts)
# Counter({'Oct': 2, 'May': 1, 'Sept': 1})