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

Posted

技术标签:

【中文标题】使用python 3创建字典时出现值错误【英文标题】:Value Error when creating dictionary using python 3 【发布时间】:2018-02-01 05:03:12 【问题描述】:

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

感谢您在这方面的任何帮助!

【问题讨论】:

你有一个return 声明,但我没有看到你声明一个函数。 float(record[...]) 可以用 0 到 9 之间的任何整数替换 ... 会引发此异常,因为您试图从与浮点数无关的字符串中生成浮点数。 float(record[6]) 实际上是 float("Central Pressure"),因此出现错误。 @zezollo,记录指的是 r1 而不是键 zip 键/值可能更容易。然后您可以迭代这些值并在之后解决类型转换和验证问题。代码可能会更简单,更容易理解。 @Clock Slave 嗨我已经编辑了我的代码,忘了把定义放在前面.. 【参考方案1】:

错误在于

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

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

【讨论】:

谢谢!如果我想从字典中删除一对值和键,如果键的值为“”,它是空的,该怎么办?【参考方案2】:

尝试实现这个

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)

【讨论】:

您好,感谢您的帮助,请问我是否想从字典中删除此值,我该怎么办? 哪个值?你说的删除是什么意思?您想用其他值替换它还是想从记录中删除它? 就像 r2 中的半径一样,它是 "",它是空的,我应该把它排除在字典之外 所以对于 r2 我希望字典显示 a2 = "id": "AU190607_01U", "name": "unnamed", "year": 1907, "month": 1, "day ": 17, "hour": 23,"central pressure": 994.0, "speed": 10.3, "lat": -13.0, "long": 146.5 所以我认为它是从记录中删除..? 嗨,谢谢,但我可以知道为什么会这样吗?抱歉这么多问题,我对 python 很困惑..【参考方案3】:

这是帮助您处理空白值的方法(在制作字典时不更改类型)。

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

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

【讨论】:

new_list = zip(key,value) record_dictionary = a: b for a, b in new_list if b != "" 我试图将两个列表压缩在一起,但我认为这仍然不能当检测到空值时删除键..请问这条线应该做什么?谢谢。 @jiajiahong 你好!我刚刚尝试过,它在你的例子中对我有用,也许我误解了这个任务。 r1 和 r2 是两个不同的行,应该在最终结果中,但不会有键/值对与 r2 中的空白值 - 对吗?这个方法的作用:它通过一个条件压缩生成字典,即 b(值)不是空白。

以上是关于使用python 3创建字典时出现值错误的主要内容,如果未能解决你的问题,请参考以下文章

在自定义数据集上使用 roboflow 对象检测 Yolov4 pytorch 模型时出现值错误

尝试在 Django 中迁移模型时出现值错误

Python - 将字典列表附加到嵌套的默认字典时出现关键错误

尝试使用 LINQ 创建字典时出现转换错误

分配时出现 Python 字典键错误 - 我该如何解决?

使用 Python、Flask、HTML 时出现 NSException 错误