2016-10-24 39 views
-1

我必须作为一个赋值语句来编写代码,如果输入日期不是,则返回一个带有'*'的输入列表的相同长度的列表格式正确(gg-mm-yyyy),否则返回月份缩写(例如11月份的nov)。输入由检查程序给出。 如果我没有解释得很好有一个例子试图在不同类型的列表中的所有元素上使用len

输入列表 - >[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

您的示例输出使用* full * month名称'october',但您的代码使用缩写。在我的回答中,我使用了'calendar.month_abbr'来提供缩写的月份名称,但是如果您需要*全部*月份名称,只需使用'_name'对'_abbr'部分进行重新设置即可使用['calendar.month_name'] ://docs.python.org/3/library/calendar.html#calendar.month_name)。你可能想澄清你需要什么。 –

回答

0

您从列表为传出,只是添加这些“*”/之后的月份名称条目;像:

outgoing = [] 
outgoing.append(... whatever ...) 

对于 “决定” 的一部分 - 根本不叫在每个条目len个。相反,检查它的类型,并从那里开始工作。请参阅here以了解其中的一种方法!

+0

查看我更新的答案。 – GhostCat

+0

此外,测试一种类型是一种选择(看你跳跃之前),但捕捉异常*可能是一个更好的解决方案(请求宽恕)。 –

+0

他的输入列表中包含所有*种*的元素。在这种情况下,我认为实际上*更好* A)识别那些*可能*需要转换的对象B)将这些...和C)只是默认的“*”替换为其他任何对象。 – GhostCat

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] 
+0

谢谢,但这种方法的问题是,我同时打印 '10-10-2007''2-3-1962',其中第二个不正确,因为它应该有02-03是正确的。有没有什么办法可以用''%d-%m-%Y'来修改它“ – over96

+0

@ over96:'2-3-1962'被解析没有问题。前导零是'datetime.strptime()'的可选项。 –

+0

@ over96:或者你的意思是说,当你得到这个值而不是'mar'时,该方法应该返回''*'? –

0

首先,你应该先检查是否有一个字符串值开始:

if isinstance(months[c], str) and len(months[c])==d: 

二,最重要的是,解析一个字符串和/或比较某些模式(即gg-mm-yyyy)通常使用正则表达式而不是手动完成。它更快更清洁。我不会给你一个完整的解决方案(因为这是一个任务),但here你可以阅读更多关于Python正则表达式以及如何使用它们,包括使用示例。

希望有帮助!

0

当您致电len(months[c])时,您正在询问c个月的元素以获取长度。

由于months的第一个元素是int1,并且c == 0你实际上问:

len(months[c]) 
# which becomes 
len(1) 
# This raises a TypeError. 

你是正确的,int类型没有长度如列表或字符串,所以你”我有几个选择。

  1. 确保一切都通过一个字符串

    len(str(months[c])) 
    

    方法str()1转换成"1"去。

  2. 抓住你的错误马上使用try:catch

    try: 
        str_length = len(months[c]) 
    except TypeError: 
        # Do something so we know this is invalid 
    
  3. 检查你的类型的测试之前str

    if isinstance(months[c], str): 
        # do the usual stuff 
    else: 
        # this is invalid 
    

这一切都这样说,这是不是你唯一的您的代码存在问题。之后你将在字符串和整数之间进行比较,这将始终失败。并且一些错误的数据可以通过(如果我有一个长度为10的字符串,这不是一个合适的日期?)。我真的建议阅读python types and comparisons的一些文档。

相关问题