#python #python-3.x
#python #python-3.x
Вопрос:
У меня есть следующая функция:
function(['28-02-2016','31-02-2016'])
['february', '*']
РЕДАКТИРОВАТЬ (полная функция)
import calendar
def function(monthList):
months = {"01": "january", "02":"february", "03":"march", "04":"april", "05":"may", "06":"june", "07":"july", "08":"august", "09":"september", "10":"october", "11":"november", "12":"december"}
returnList = []
for monthStr in monthList:
month = str(monthStr)[3:5]
if month in months.keys():
if int(monthStr[:2]) <= calendar.monthrange(int(monthStr[-4:]), int(monthStr[3:5]))[1]:
returnList.append(months[month])
else:
returnList.append("*")
else:
returnList.append("*")
return returnList
Если дата правильная, функция создает список, в котором указан месяц, в противном случае ставится '*'
. Но если я напишу:
function([02-02-20a1]:
Я получаю эту ошибку:
6 month = str(monthStr)[3:5]
7 if month in months.keys():
---> 8 if int(monthStr[:2]) <= calendar.monthrange(int(monthStr[-4:]), int(monthStr[3:5]))[1]:
9 returnList.append(months[month])
10 else:
ValueError: invalid literal for int() with base 10: '20a1'
Итак, Python говорит мне, что я должен поместить элемент управления в список под номером 8. Как мне сообщить функции действовать подобным образом?
function(['02-02-19a1'])
[*]
Комментарии:
1. Это говорит вам, что
'20a1'
не является допустимым целочисленным литералом. Если вы получаетеValueError
, вы можете предположить, что это недопустимая дата, поэтому смотрите docs.python.org/3/tutorial/errors.html для обработки ошибок. Кроме того, вы можете значительно упростить с помощьюdatetime
встроенного синтаксического анализа, который будет корректно работать, например, с високосными годами.2. Python сообщает, что у вас ошибка в вашем коде / вводе
3. Я понятия не имею, что вы подразумеваете под «элементами управления». Очевидно, что «20a1» и «19a1» не являются допустимыми значениями для передачи
int
.4. «Python говорит мне, что я должен поместить элемент управления в список под номером 8» — Нет. Откуда вы взяли эту идею? Это просто говорит вам, что
'20a1'
не является целым числом. Вы должны перехватить это исключение и вернуть'*'
. Я действительно не могу дать вам более конкретный ответ, потому что вы не показали всю функцию целиком.5. @DanielRoseman int(*, base= 10) вы хотели сказать
Ответ №1:
Используйте Python time.strptime
и time.strftime
:
import time
def get_month(date_string):
try:
t = time.strptime(date_string,'%d-%m-%Y')
return time.strftime('%B', t).lower()
except ValueError:
return '*'
Если дата недопустима, ValueError
будет поднята, и в этом случае вы вернетесь '*'
.
Вызывайте get_month
для каждой строки даты в вашей функции.
def get_months(date_strings):
return [get_month(date_string) for date_string in date_strings]
Комментарии:
1. Это не охватывало бы, например
function(['bla-7-99', 'iiiiiiiiiii'])
2. Отредактировано для использования
strftime
иstrptime
вместо.3. итак, мне просто нужно добавить этот маленький абзац к тестированию моей функции?
4. @xli что, если бы я хотел добавить список потенциальных дат в качестве входных данных?
5. Вы можете добавить эту функцию в свой модуль. В вашей другой функции вызывайте
get_month
для каждой потенциальной даты в списке и добавляйте каждый результат в список, который вы затем возвращаете. Более кратко,return [get_month(monthStr) for monthStr in monthList]