You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Sympy中直接输出dict(zip())报TypeError的原因与解决办法

SymPy符号作为字典键直接输出时报错的原因与解决方法

编辑补充:仅在直接输出dict(zip(...))的结果时才会出现该问题。以下使用print输出的代码可正常运行:

import sympy as sp
x, y = sp.symbols('x,y')
d = dict(zip([x, y], [1, 1]))
print(d)

但直接输入dict(zip([x, y], [1, 1]))会触发报错。


如下极简代码:

import sympy as sp
x, y = sp.symbols('x,y')
dict(zip([x, y], [1, 1]))

会产生如下错误:

TypeError: cannot determine truth value of Relational

问题核心

请问该错误产生的原因是什么?如何解决?若无需使用OrderedDict则更为便捷。
似乎有其他用户执行相同操作未出现此错误(该用户存在其他问题)。

以下为完整代码及报错信息,使用的是旧版Python(3.6.5),本以为可正常运行:

>>> x, y = sp.symbols('x,y')
>>> dict(zip([x, y], [1, 2]))
Traceback (most recent call last):
  File "<string>", line 449, in runcode
  File "<interactive input>", line 1, in <module>
  File "<string>", line 692, in pphook
  File "C:\development\Portable Python 3.6.5 x64 R2\App\Python\lib\pprint.py", line 53, in pprint
    printer.pprint(object)
  File "C:\development\Portable Python 3.6.5 x64 R2\App\Python\lib\pprint.py", line 139, in pprint
    self._format(object, self._stream, 0, 0, {}, 0)
  File "C:\development\Portable Python 3.6.5 x64 R2\App\Python\lib\pprint.py", line 161, in _format
    rep = self._repr(object, context, level)
  File "C:\development\Portable Python 3.6.5 x64 R2\App\Python\lib\pprint.py", line 393, in _repr
    self._depth, level)
  File "C:\development\Portable Python 3.6.5 x64 R2\App\Python\lib\pprint.py", line 405, in format
    return _safe_repr(object, context, maxlevels, level)
  File "C:\development\Portable Python 3.6.5 x64 R2\App\Python\lib\pprint.py", line 511, in _safe_repr
    items = sorted(object.items(), key=_safe_tuple)
  File "C:\development\Portable Python 3.6.5 x64 R2\App\Python\lib\site-packages\sympy\core\relational.py", line 384, in __nonzero__
    raise TypeError("cannot determine truth value of Relational")
TypeError: cannot determine truth value of Relational

错误原因

从报错栈可以定位到问题根源:

  1. Python 3.6.5的交互式环境中,直接输入表达式回车时,解释器会调用pprint模块美化输出结果。
  2. pprint处理字典时,会强制对键值对排序(sorted(object.items(), key=_safe_tuple))。
  3. 排序过程需要比较SymPy符号的大小,但SymPy的符号是抽象变量,比较时不会返回布尔值,而是生成Relational对象(比如x > y)。当pprint尝试将这个对象转为布尔值用于排序时,就触发了报错——因为SymPy无法确定抽象符号关系的真值。

而用print()输出时,Python直接调用字典的__str__方法,不会触发排序操作,因此不会报错。

解决方法

方法1:用print输出(最便捷)

直接将结果赋值给变量后用print()输出,绕过pprint的排序逻辑:

import sympy as sp
x, y = sp.symbols('x,y')
d = dict(zip([x, y], [1, 1]))
print(d)

方法2:禁用交互式环境的pprint

修改sys.displayhook,让解释器直接打印结果而非美化:

import sys
sys.displayhook = lambda obj: print(obj) if obj is not None else None

之后直接输入dict(zip([x, y], [1, 1]))就不会报错。

方法3:手动调用字典的字符串方法

直接调用字典的__repr__或__str__方法输出:

import sympy as sp
x, y = sp.symbols('x,y')
print(repr(dict(zip([x, y], [1, 1]))))

方法4:升级Python版本

Python 3.7及以上版本中,字典默认保留插入顺序,pprint不再强制排序。升级后直接输入表达式也不会触发此错误。

内容的提问来源于stack exchange,提问作者sancho.s ReinstateMonicaCellio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 17:08:12