2017-08-23 23 views
1

我是一个对Python完全陌生的学生,目前正在学习它。 所以我被要求从列表中创建一个包含文件中的一行数据的字典。使用python创建字典时的值错误3

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中),它应该被排除在字典之外,我应该怎么做才能做到这一点?

感谢您的帮助!

+0

你有一个'return'语句,但我没有看到你声明一个函数。 –

+1

'float(record [...])'你可以用0到9之间的任何整数替换'...'会抛出这个异常,因为你试图从一个无关的字符串中创建一个float浮动。 'float(record [6])'实际上是float(“Central Pressure”)',因此是错误。 – zezollo

+0

@zezollo,记录涉及r1而非密钥 –

回答

1

尝试实施这一

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

嗨,感谢您的帮助,请问如果我想从字典中删除这个值,我该怎么办? –

+0

哪个值?你的意思是删除?你想用其他值替换它,或者你想从记录中删除它? –

+0

它在r2中为半径它是“”,这是空的,我应该把它从字典中删除 –

2

错误在于

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

因为在你的第二个值列表,record[7]""这不是一个有效的float文字。

+0

谢谢! 如果我想从字典中删除一对值和密钥,如果密钥的值是“”,这是空的,该怎么办? –

0

以下是帮助您使用空白值的方式(在制作字典时不改变类型)。

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

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

+0

new_list = zip(key,value) record_dictionary = {a:b for a,b in new_list if b!=“”}我试图将这两个列表压缩在一起,但我认为这仍然无法删除空键值被检测到..我可以问这条线应该做什么?谢谢。 –

+0

@jiajiahong嗨!我刚刚尝试过,它对我的​​例子很有帮助,也许我误解了这个任务。 r1和r2是两个不同的行,它们应该是最终结果,但不会有r2中空白值的键/值对 - 是吗? 这个方法做了什么:它使一个字典从一个条件压缩,b(值)不是空白。 – Nibuton