太多无法解压元组 NLTK Chat

Too many to unpack tuple NLTK Chat

我一直在研究聊天机器人。我已经为我的机器人广泛使用了 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'))
     )

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

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

将与此相同:

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

其中第一个元素是 'test (.*)',第二个元素是 ('a', 'b')

基本上只是在元组结构中添加括号并不意味着您在嵌套它。为了实现您的预​​期,您应该明确定义元组。如果将 pair 初始化更改为:

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

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

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

希望这能解释错误的原因。

接受的答案是 spot-on 关于问题的根源,但它遗漏了一个重要的细节: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'))
     ]