繁体   English   中英

使用python 3创建字典时出现值错误

[英]Value Error when creating dictionary using python 3

我是一名完全不熟悉python的学生,目前正在学习它。 因此,我被要求从包含文件中一行数据的列表中创建字典。

record = ["Name", "ID", "datetime", "Type", "Lat", "Long", "Central Pressure", "Mean radius gf wind", "Max wind speed", "Comment"]

该文件已被导入,并且包含与record列表中的元素对应的多行数据。

数据示例:

r1 = ["unnamed", "AU190607_01U", "1907-01-17 23:00", "T", "-13", "146.5", "994", "100", "10.3"]        
r2 = ["unnamed", "AU190607_01U", "1907-01-17 23:00", "T", "-13", "146.5", "994", "", "10.3"]  

所以我的代码就像

def parse_record(record):
key = ["id", "name", "year", "month", "day", "hour", "central pressure",
       "radius", "speed", "lat", "long"]
value = [str(record[1]), str(record[0]), int((record[2][:4]),
         int((record[2])[5:7]),int((record[2])[8:10]),
         int((record[2][10:13]),float(record[6]), 
         float(record[7]),float(record[8]),float(record[4]), float(record[5])]

record_dictionary = dict(zip(key,value))

return record_dictionary

我期望得到

a1 = {"id": "AU190607_01U", "name": "unnamed", "year": 1907, "month": 1,
      "day": 17, "hour": 23,"central pressure": 994.0, "radius": 100.0,
      "speed": 10.3, "lat": -13.0, "long": 146.5}

但我收到一条错误消息:

int((record[2])[8:10]),int((record[2])[10:13]), float(record[6]), float(record[7]),
ValueError: could not convert string to float: 

并且如果数据中有一个空白值(例如在上面的r2中),则应该将其排除在字典之外,我应该怎么做才能实现这一点?

感谢您的帮助!

错误在于

value = […, float(record[7])…]

由于在第二个值列表中, record[7]"" ,这不是有效的浮点文字。

尝试实现这个

def parse_record(record):
    key = ["id", "name", "year", "month", "day", "hour", "central pressure",
           "radius", "speed", "lat", "long"]
    record = [i if i else 0 for i in record]
    value = [str(record[1]), str(record[0]), int((record[2])[:4]),
             int((record[2])[5:7]),int((record[2])[8:10]),
             int((record[2])[10:13]),float(record[6]), 
             float(record[7]),float(record[8]),float(record[4]), float(record[5])]

    record_dictionary = dict(zip(key,value))

    return record_dictionary

record = ["unnamed", "AU190607_01U", "1907-01-17 23:00", "T", "-13", "146.5", "994", "", "10.3"]        

r1 = ["unnamed", "AU190607_01U", "1907-01-17 23:00", "T", "-13", "146.5", "994", "100", "10.3"]        
r2 = ["unnamed", "AU190607_01U", "1907-01-17 23:00", "T", "-13", "146.5", "994", "", "10.3"]  

parse_record(r1)
parse_record(r2)

请注意,在第二条记录的输出中,您的radius值将为零。 这是因为该记录没有值。

编辑

我进行了更改。

def parse_record(record):
    key = ["id", "name", "year", "month", "day", "hour", "central pressure",
           "radius", "speed", "lat", "long"]
    record = [i if i else 0 for i in record]

    value = [str(record[1]), str(record[0]), int((record[2])[:4]),
             int((record[2])[5:7]),int((record[2])[8:10]),
             int((record[2])[10:13]),float(record[6]), 
             float(record[7]),float(record[8]),float(record[4]), float(record[5])]
    _ = [(a,b) for a,b in zip(key,value) if b]
    record_dictionary = dict(_)

    return record_dictionary

record = ["unnamed", "AU190607_01U", "1907-01-17 23:00", "T", "-13", "146.5", "994", "", "10.3"]        

r1 = ["unnamed", "AU190607_01U", "1907-01-17 23:00", "T", "-13", "146.5", "994", "100", "10.3"]        
r2 = ["unnamed", "AU190607_01U", "1907-01-17 23:00", "T", "-13", "146.5", "994", "", "10.3"]  

parse_record(r1)
parse_record(r2)

这是将为您提供空白值(在制作字典时不更改类型)的方法。

record_dictionary = {a:b for a,b in zip(key,value) if b != '' }

上面有一个很好的建议,即@tdube首先压缩zip键和值,然后才更改那里的类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM