使用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 模型时出现值错误