我有一个" x:y"形式的数据列表,我试图将其转换为浮点数x / y。以下是我的代码
def ratio_to_float (ratio):
[numer,denum] = ratio.split(" : ")
if int(denum) == 0:
num = math.inf
else:
num = int(numer)/int(denum)
return num
但是,我一直收到以下错误
[numer,denum] = ratio.split(" : ")
ValueError:没有足够的值来解包(预期2,得到1)
但是,我最后一次检查时,列表仍然是" x:y"的形式。有人可以告诉我我的代码的哪一部分导致了这个错误?任何帮助表示赞赏。 (:
编辑:我实际上有一个来自pandas库的Series类型对象,它包含这些比率的字符串。我的输入是lst.map(ratio_to_float,na_action ="忽略")。
我也尝试了前5个条目,它们似乎运作良好。
答案 0 :(得分:1)
您收到的错误表明split
仅在某个时刻返回单值列表。这意味着在程序运行的某个地方,它会使用一个不包含" : "
的字符串调用您的函数。如果你在一个比率列表上运行,可能有一个是畸形的(也许是缺少一个空格)。或者,如果您正在读取文件,也许最后一行是空字符串?
要解决此问题,您可以尝试在try
周围放置except
/ split
块并解压缩,并在发生异常时打印一些诊断信息:
def ratio_to_float (ratio):
try:
numer, denum = ratio.split(" : ")
except ValueError:
print(repr(ratio))
raise
if int(denum) == 0:
num = math.inf
else:
num = int(numer)/int(denum)
return num
答案 1 :(得分:0)
.split(":")
删除空格。
代码:
def ratio_to_float(ratio):
numer,denum = ratio.split(":")
if int(denum) == 0:
num = math.inf
print(num)
else:
num = int(numer)/int(denum)
print(num)
return num
ratio_to_float("10:5")
输出:2
如果您正在阅读比率列表:
def ratio_to_float(ratio):
res=[]
for r in ratio:
[numer,denum] = r.split(":")
numer=int(numer)
denum=int(denum)
if denum == 0:
num = math.inf
else:
num = (numer)/(denum)
res.append(num)
return res
print(ratio_to_float(["10:5", "5:2"]))
输出:
[2.0, 2.5]
答案 2 :(得分:0)
你也可以通过制作一个List来做到这一点。
使用列表的主要原因是,您可以采用多个浮动数字并通过迭代获得结果。
将space
从ratio.split(" : ")
移至ratio.split(":")
def ratio_to_float(ratio):
numer = ratio.split(":").list
if int(numer[1]) == 0:
num = math.inf
print(num)
else:
num = int(numer[0])/int(numer[1])
print(num)
return num
答案 3 :(得分:0)
如果您正在使用pandas
系列,那么请点击此处。您可以使用内置的fractions.Fraction
类和一些字符串操作来完成提升......
import pandas as pd
from fractions import Fraction
s = pd.Series(["37 : 63", "100 : 0", "45 : 55"])
def ratio_to_float(value):
# Change : to / and remove spaces...
if not isinstance(value, str):
return value
s = value.translate(str.maketrans(':', '/', ' '))
try:
# Let's see if the Fraction class can handle it
return float(Fraction(s))
except ZeroDivisionError:
return pd.np.nan # or whatever...
然后使用:
s.map(ratio_to_float)
给你:
0 0.587302
1 NaN
2 0.818182
dtype: float64