请原谅我的拙劣标题,我真的想不出一个合适的标题。
这是我的问题。假设我得到了一个字符串列表:
['2010.01.01',
'1b',
'`abc'
'12:20:33.000']
而且我想做一个“类型检查”,以便给定第一个字符串,它返回类型日期,第二个布尔值,第三个一个符号,一次第四个......等等。返回的值可以是一个字符串或任何东西,因为所有我想做的是转换正确的ctypes。
有什么办法吗?
ps:我的python是2.5
>>> str = ['2010.01.01',
... '1b',
... '`abc'
... '12:20:33.000']
>>> [type(x) for x in str]
[<type 'str'>, <type 'str'>, <type 'str'>]
假设您使用 eval 来确定此列表。
如果您完全确定您可以信任内容 - 例如,它不是来自可以以某种方式将代码潜入列表的用户 - 您可以将列表映射到eval,它将捕获像数字这样的本机类型。但是,没有简单的方法可以知道这些字符串的全部含义——例如,如果您尝试升级 '2010.01.01',python 会认为您正在尝试解析一个数字,然后由于额外的小数而失败。
所以你可以尝试一个两阶段的策略:首先使用 eval 将列表转换为字符串与数字:
def try_cast (input_string):
try:
val = eval(input_string)
val_type = type(val)
return val, val_type
except:
return input_string, type('')
cast_list = map (try_cast, original_list)
这将给出一个元组列表,其中第二项是类型,第一项是转换后的项。对于更专业的事情,例如日期,您需要对第一次传递后剩余的字符串使用相同的策略,使用 try/except 块尝试使用time.strptime()将它们转换为日期。您需要弄清楚预期的时间格式并为每个格式生成一个解析表达式(您可以查看 python 文档或类似http://www.tutorialspoint.com/python/time_strptime.htm之类的内容)尝试所有选项并查看哪些选项正确转换 - 如果一个有效,则值为日期;如果没有,它只是一个字符串。