太多无法解压元组 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'))
]
我一直在研究聊天机器人。我已经为我的机器人广泛使用了 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'))
]