我必须编写一个赋值,一个程序,如果输入日期格式不正确(gg-mm-yyyy),则返回输入列表相同长度的列表,并带有'*',否则它返回月份缩写(例如11月的nov)。输入由检查程序给出。 如果我没有很好地解释它有一个例子
输入列表 - > [1,'10-10-2007', '2-3-1962','home', '31-11-2007']
输出列表 - > ['*', 'october', '*', '*', '*']
现在我的问题在哪里。我正试图运行这样的东西
months=[1,'10-10-2007', '2-3-1962','casa', '31-11-2007']
b=['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec']
c=0
d=10
if len(months[c]) == d:
z+=1
if months[c][3] == 1:
e=10+months[c][4]
c=c+1
else e=months[c][4]
c=c+1
else
c=c+1
print('*')
print(b[e-1])
我现在得到的错误是
TypeError: object of type 'int' has no len()
我知道int
不能有长度。但是,我怎样才能将int
翻译成可能有长度的东西?
答案 0 :(得分:3)
您假设您可以对输入列表中的所有元素使用len()
,但整数没有长度。
您可以使用异常处理来解决此类限制:
try:
if len(months[c]) == d:
# ...
except TypeError:
# not an object with length, can't be a date
我强烈建议您在此处使用datetime
module,并尝试使用datetime.datetime.strptime()
method解析成功。同样,使用异常处理来忽略任何无法解析的内容:
import datetime
import calendar
def extract_month(value):
try:
if len(value) != 10:
return '*' # only dates of *exactly* 10 characters
dt = datetime.datetime.strptime(value, '%d-%m-%Y')
return calendar.month_abbr[dt.month].lower()
except (ValueError, TypeError):
return '*'
datetime.datetime.strptime()
会在传递不是字符串的内容时引发TypeError
异常,如果值 是字符串则会引发ValueError
异常但无法使用提供的模式解析(此处查找dd-mm-yyyy
- 样式的日期)。
我使用calendar.month_abbr
sequence提供缩写的月份名称;如果您需要有完整的月份名称,请将其替换为calendar.month_name
(您的问题预期输出使用全名,但您的代码使用缩写)。
使用该功能提供月份名称)您可以轻松转换输入:
outputlist = [extract_month(value) for value in inputlist]
答案 1 :(得分:0)
你开始使用空列表进行传出,之后只需添加那些" *" / month-name条目;像:
outgoing = []
outgoing.append( ... whatever ... )
为此"决定"部分 - 根本不要在每个条目上调用 len 。相反,检查它的类型,并从那里工作。请参阅here了解一种方法!
答案 2 :(得分:0)
首先,您应首先检查是否有一个字符串值开头:
if isinstance(months[c], str) and len(months[c])==d:
其次,最重要的是,解析字符串和/或与某些模式(即gg-mm-yyyy)进行比较通常使用正则表达式而不是手动完成。它更快更干净。我不会给你一个完整的解决方案(因为这是一个任务),但here你可以阅读更多关于Python中的正则表达式以及如何使用它们,包括用法示例。
希望有所帮助!
答案 3 :(得分:0)
当您致电len(months[c])
时,您要求获得长度的c
个月元素。
由于months
的第一个元素是int
,1
和c == 0
,您实际上是在询问:
len(months[c])
# which becomes
len(1)
# This raises a TypeError.
你是对的,int
类型的长度不像列表或字符串,所以你有一些选择。
确保所有内容都是字符串
len(str(months[c]))
方法str()
会将1
转换为"1"
。
使用try:catch
try:
str_length = len(months[c])
except TypeError:
# Do something so we know this is invalid
在测试前检查您的类型是否为str
:
if isinstance(months[c], str):
# do the usual stuff
else:
# this is invalid
尽管如此,这不是您的代码唯一的问题。您将在以后的字符串和整数之间进行比较,这将始终失败。并且一些错误的数据可以通过(如果我有一个长度为10且不是正确日期的字符串怎么办?)。我真的建议您阅读python types and comparisons上的一些文档。