【问题标题】:Too many to unpack tuple NLTK Chat元组太多,无法解包 NLTK 聊天
【发布时间】:2017-06-03 18:18:02
【问题描述】:

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

【问题讨论】:

  • 请使用编辑器内置的格式化工具!不要只是添加反引号以为它会格式化!
  • 肯定行!

标签: python regex tuples nltk chatbot


【解决方案1】:

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

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

将与此相同:

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

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

基本上只是在元组结构中添加括号并不意味着您正在嵌套它。为了实现您的意图,您应该明确定义元组。如果你把pair初始化改成这样:

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

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

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

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

【讨论】:

  • 我从没想过逗号会是个问题
  • 当我将它附加到现有元组时它不起作用
  • @AbuTahir 你能用你当前的元组更新你的问题吗?谢谢
【解决方案2】:

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

【讨论】:

  • 问题是将我的数据附加到现有的数据结构中,所以我必须这样做!
  • 不,你没有。你甚至不能将 anything 附加到元组,你不知道吗?
  • 我已经合并了它......就像我为它创建了一个新的数据结构一样。因为我正在使用的包就像它需要的那样
  • "你正在使用的包"如果你把圆括号改成方括号就不行了,从而传递一个列表?坦率地说,这令人难以置信。你为什么不试一试,而不是告诉我“它行不通”。
猜你喜欢
  • 1970-01-01
  • 2019-03-28
  • 2018-08-12
  • 1970-01-01
  • 2018-07-01
  • 2021-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多