【问题标题】:Converting ratio to floating points将比率转换为浮点数
【发布时间】:2016-06-28 04:14:30
【问题描述】:

我有一个“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 = "ignore")。

我也在前 5 个条目上进行了尝试,它们似乎运行良好。

【问题讨论】:

  • 在该行之前执行 print(ratio.split(" : ")) 以查看其实际内容。
  • 即使你解决了拆分问题,你也不想做num = int(numer)/int(denum),因为这将强制整数除法,而不是给你一个浮点答案。你想要float(numer)/float(denum)
  • @gariepy:问题标记为 Python-3.x,因此使用 / 运算符时整数除法不是问题。
  • @gariepy 如果 OP 已为 Python 3.x 正确标记 - 即使 int(number) / int(denum) 将导致浮动结果...
  • @GuoXianYau:你得到的是实际的字符串'x''y',还是只是一些数字的简写?我希望这会导致一组完全不同的异常,但不是你描述的那个。

标签: python python-3.x


【解决方案1】:

您收到的错误表明split 在某些时候只返回一个单值列表。这意味着当您的程序运行时,它正在使用其中不包含" : " 的字符串调用您的函数。如果您正在对比率列表进行操作,则可能其中一个格式不正确(可能缺少空格)。或者如果你正在从文件中读取,也许最后一行是一个空字符串?

要解决此问题,您可以尝试在split 周围放置一个try/except 块并解包,并在发生异常时打印一些诊断信息:

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

【讨论】:

  • 不知何故它不打印任何信息。唯一的错误是我在上面粘贴的错误。 :|
  • 在异常回溯出现之前查看。应该有一个额外的输出行,打印ratio 参数。如果ratio 字符串为空,它可能只是''
  • 认为它实际上可能是 '' :\
【解决方案2】:

如果您正在使用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

【讨论】:

  • 这引发了另一个错误,它显示“AttributeError: “float” object has no attribute 'translate'”。很确定 value 不是 float 类型。
  • 我会仔细检查。我现在真的很困惑。
  • @GuoXianYau 我已经更新了代码以返回原始值,如果它不是一个字符串...如果没有正确的输入/输出就不能做很多其他事情 - 但鉴于你提供的- 它应该可以工作 - 虽然不能花太多时间来提供帮助
  • 谢谢。您的代码帮助很大。而且我开始认为我的室友实际上是在通过将其中一个输入更改为“33:67”来恶作剧,即没有空格。
  • 我给你点是因为你的评论最能帮助我调试它。 (:
【解决方案3】:

.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]

【讨论】:

  • 为什么 '[' 和 ']' 很重要?
  • 那无济于事。该位置的括号不是必需的,但也无害。
  • 我不太确定这有什么帮助 - 如果 OP 在打开 ratio 时遇到太少(看起来)(或可能太多)的问题 - 差别不大 - 输入只需要一点消毒...
  • @Blckknght 它实际上是一个split() 问题。 : 我猜后面没有空格..
  • @GuoXianYau 可能值得编辑你的问题以包含它 - 它完全改变了上下文
【解决方案4】:

您也可以通过制作列表来做到这一点。 使用列表的主要原因是,您可以取多个浮点数并通过迭代获得结果。
spaceratio.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

【讨论】:

  • 这与其他两个答案相同。
  • 你明白这个答案吗?我使用列表来存储获取拆分值
  • 差别不大。
  • @AniMenon:真的吗?我想问一个问题。试想,如果你有一个数字列表并且需要获取每一对浮点数,那么你能做什么呢?例如:10:5:4:2:6:3 .....
  • 你的脚本是这样工作的吗?这对那个用例会很好,但你的代码不能那样工作!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-03
  • 1970-01-01
  • 1970-01-01
  • 2019-01-06
  • 2011-02-28
相关资源
最近更新 更多