太多,无法解包元组NLTK Ch

2024-04-25 02:21:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在开发一个聊天机器人。我已经在我的bot中大量使用了nltk.chat。但是我想给这些对添加更多的特性,而不是默认的特性。当我尝试添加新的一对时,我得到了一个错误。你知道吗

alex=Chat(pair,reflections)
File "/usr/local/lib/python2.7/dist-packages/nltk/chat/util.py", in __init__
self._pairs = [(re.compile(x, re.IGNORECASE),y) for (x,y) in pairs]
ValueError: too many values to unpack

我的代码:

pair=(
      (r'test (.*)',('a','b'))
     )

Tags: inreusrbot错误chat机器人特性
2条回答

你的一对正在失去你想要的结构,例如:

pair=((((r'test (.*)', ('a','b')))))

与此相同:

('test (.*)', ('a', 'b'))

其中第一个元素是'test (.*)',第二个元素是('a', 'b')。你知道吗

基本上,向元组结构添加括号并不意味着要嵌套它。为了达到您的目的,您应该在元组的定义中明确说明。如果将pair初始化更改为:

pair=( 
      (r'test (.*)', ('a','b')),
     )

(注意最后一个右括号前的逗号)

现在你的迭代可以工作了。因为第一个元素是('test (.*)', ('a', 'b')),而不仅仅是字符串test (.*)

希望这能解释错误的原因。你知道吗

公认的答案是关于问题的根源的,但它忽略了一个重要的细节:Python风格要求您use tuples only for collections in which each element has a specific role.对于未区分的集合,使用list(方括号)。在列表pair中传递的每个元组都是一对(<regexp>, <data>),因此正确地写为tuple。但是pair本身就是这样一个元组的集合,应该写成一个列表,而不是元组。另外,列表括号是明确的,当列表只有一个元素时,您不需要记住添加逗号:

# (works properly)
pair = [
      (r'test (.*)', ('a','b'))
     ]

相关问题 更多 >