尝试在具有不同类型的列表的所有元素上使用len

时间:2016-10-24 11:50:24

标签: python list

我必须编写一个赋值,一个程序,如果输入日期格式不正确(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翻译成可能有长度的东西?

4 个答案:

答案 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的第一个元素是int1c == 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
    
  4. 尽管如此,这不是您的代码唯一的问题。您将在以后的字符串和整数之间进行比较,这将始终失败。并且一些错误的数据可以通过(如果我有一个长度为10且不是正确日期的字符串怎么办?)。我真的建议您阅读python types and comparisons上的一些文档。