如何在 python 中使用无穷大
How to use infinity in python
我正在 python 中处理图表。我正在尝试获取每个顶点之间的距离。对于一个顶点与另一个顶点之间没有直接路径的情况,我需要使用值 INFINITY(使用字符串“-”表示)。我尝试了几种解决方案。一个是使用一个疯狂的大整数来表示无穷大。但是,我研究并发现这是不好的做法。我还看到了几个关于堆栈溢出的解决方案,它们利用了数学模块的无穷大函数。但是,这不适合我的问题,因为我的 INFINITY 值正在 UI 中使用并且必须在图形上看起来令人愉悦。这就是为什么我的 INFINITY 必须保留为字符串“-”。这是我当前代码行遇到的错误:
TypeError: '<' not supported between instances of 'str' and 'int'
我不太确定,但我认为 < 是因为我使用了 min() 函数。
此错误来自以下代码:
for i in range(length):
for j in range(length):
for k in range(length):
#print('40:', int(temp[j][i]), int(temp[i][k]))
temp[j][k] = min(temp[j][k], addWithInfinity(temp[j][i],temp[i][k]))
Temp 只是指我在当前使用的方法中作为参数收到的矩阵。这是我的 addWithInfinity 方法:
def addWithInfinity(a, b):
"""If a == INFINITY or b == INFINITY, returns INFINITY.
Otherwise, returns a + b."""
if a == LinkedDirectedGraph.INFINITY or b == LinkedDirectedGraph.INFINITY:
return LinkedDirectedGraph.INFINITY
else: return a + b
我的问题是我正在尝试将无穷大与 int 进行比较。我尝试将 INFINITY 转换为 int,如下所示:int(INFINITY)(或 int('-')),但出现以下错误:
ValueError: invalid literal for int() with base 10: '-'
有什么想法可以让我摆脱 int 和 INFINITY(字符串)之间的比较吗?
使用float("inf")
或math.inf
另见 How can I represent an infinite number in Python?
>>> float("inf") > 5
True
>>> float("inf") < 10**100
False
>>> import math
>>> float("inf") == math.inf
True
如果您需要使用 "inf"
以外的其他值来表示无穷大,例如您示例中的 '-'
,您可以 try/except
它,或者
- 检查初始值是否是您的目标字符串 (
if a == '-':
)
- 解析在其上调用float的错误(
if "'-'" in str(err_string):
)
try:
a = float(a)
except ValueError as ex:
# special-case for ValueError: could not convert string to float: '-'
if "'-'" in str(ex).split(":")[-1]:
a = float("inf")
else: # re-raise other ValueErrors
raise ex
String "-"
不是无穷大,即使你是认真的。在Python中,可以通过两种方式获取类型:
float("inf")
或
import math
math.inf
你的问题与无限类型的用法或用例无关,而是表示问题。我相信你应该在你的数学中使用正常的无穷大类型并在你的 class 中创建一个 属性 那 returns "-"
然后只有当你需要代表它时才使用它UI 但不在你的数学中。
您遇到的问题更多是关于表示和逻辑的解耦。
我正在 python 中处理图表。我正在尝试获取每个顶点之间的距离。对于一个顶点与另一个顶点之间没有直接路径的情况,我需要使用值 INFINITY(使用字符串“-”表示)。我尝试了几种解决方案。一个是使用一个疯狂的大整数来表示无穷大。但是,我研究并发现这是不好的做法。我还看到了几个关于堆栈溢出的解决方案,它们利用了数学模块的无穷大函数。但是,这不适合我的问题,因为我的 INFINITY 值正在 UI 中使用并且必须在图形上看起来令人愉悦。这就是为什么我的 INFINITY 必须保留为字符串“-”。这是我当前代码行遇到的错误:
TypeError: '<' not supported between instances of 'str' and 'int'
我不太确定,但我认为 < 是因为我使用了 min() 函数。
此错误来自以下代码:
for i in range(length):
for j in range(length):
for k in range(length):
#print('40:', int(temp[j][i]), int(temp[i][k]))
temp[j][k] = min(temp[j][k], addWithInfinity(temp[j][i],temp[i][k]))
Temp 只是指我在当前使用的方法中作为参数收到的矩阵。这是我的 addWithInfinity 方法:
def addWithInfinity(a, b):
"""If a == INFINITY or b == INFINITY, returns INFINITY.
Otherwise, returns a + b."""
if a == LinkedDirectedGraph.INFINITY or b == LinkedDirectedGraph.INFINITY:
return LinkedDirectedGraph.INFINITY
else: return a + b
我的问题是我正在尝试将无穷大与 int 进行比较。我尝试将 INFINITY 转换为 int,如下所示:int(INFINITY)(或 int('-')),但出现以下错误:
ValueError: invalid literal for int() with base 10: '-'
有什么想法可以让我摆脱 int 和 INFINITY(字符串)之间的比较吗?
使用float("inf")
或math.inf
另见 How can I represent an infinite number in Python?
>>> float("inf") > 5
True
>>> float("inf") < 10**100
False
>>> import math
>>> float("inf") == math.inf
True
如果您需要使用 "inf"
以外的其他值来表示无穷大,例如您示例中的 '-'
,您可以 try/except
它,或者
- 检查初始值是否是您的目标字符串 (
if a == '-':
) - 解析在其上调用float的错误(
if "'-'" in str(err_string):
)
try:
a = float(a)
except ValueError as ex:
# special-case for ValueError: could not convert string to float: '-'
if "'-'" in str(ex).split(":")[-1]:
a = float("inf")
else: # re-raise other ValueErrors
raise ex
String "-"
不是无穷大,即使你是认真的。在Python中,可以通过两种方式获取类型:
float("inf")
或
import math
math.inf
你的问题与无限类型的用法或用例无关,而是表示问题。我相信你应该在你的数学中使用正常的无穷大类型并在你的 class 中创建一个 属性 那 returns "-"
然后只有当你需要代表它时才使用它UI 但不在你的数学中。
您遇到的问题更多是关于表示和逻辑的解耦。