2017-01-19 11 views
0

Я работаю над бот-чатом. Я очень хорошо использовал 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')) 
    ) 
+0

Пожалуйста, используйте инструменты форматирования, построенные прямо в редакторе! Не просто добавляйте обратные сигналы, думая, что они будут отформатированы! – Soviut

+0

уверенный предмет сделаю! –

ответ

1

Ваша пара теряет структуру, которую вы предназначенную, например:

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

будет такой же, как это:

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

Где первый элемент: 'test (.*)', а второй - ('a', 'b').

В принципе просто добавление скобок в структуру кортежа не означает, что вы вложили его в гнездо. Чтобы достичь того, что вы намеревались, вы должны четко указать свое определение кортежа. При изменении pair инициализации этого:

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

(Обратите внимание на запятую до окончательной закрывающей скобки)

Теперь ваша итерация будет работать. В качестве первого элемента находится ('test (.*)', ('a', 'b')), а не только строка test (.*)

Надеюсь, это объяснит причину ошибки.

+0

спасибо, что очень помогли! –

+0

Я никогда не думал, что запятая была бы проблемой –

+0

он не работает, когда я добавляю его в существующий кортеж –

1

Принятый ответ касается источника проблемы, но в нем отсутствует важная деталь: стиль 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')) 
    ] 
+0

проблема заключается в том, чтобы добавить мои данные в существующую структуру данных, поэтому я делаю это так! –

+0

Нет, вы этого не сделаете. Вы даже не можете добавить _anything_ в кортеж, дон вы знаете, что? – alexis

+0

Я объединил его .. как я создал новую структуру данных для него, потому что пакет, который я использую, как будто это необходимо в таком стиле –