2017-01-19 3 views
0

Ich habe an einem Chat-Bot gearbeitet. Ich habe nltk.chat ganz ausgiebig für meinen Bot verwendet. Aber ich möchte den anderen Paaren als dem Standardpaar weitere hinzufügen. Wenn ich versuche, ein neues Paar hinzuzufügen, bekomme ich einen Fehler.Zu viele Tupel entpacken 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 

mein Code:

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

Bitte beachten Sie die Formatierungstools direkt in den Editor gebaut nutzen! Fügen Sie nicht nur Backticks hinzu, die denken, dass es formatiert wird! – Soviut

+0

sichere Sache wird! –

Antwort

1

Ihr Paar die Struktur verliert man beabsichtigt, zum Beispiel:

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

wäre das gleiche wie sein:

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

Wo das erste Element ist 'test (.*)' und der zweite ist ('a', 'b').

Wenn Sie einer Tupelstruktur nur Klammern hinzufügen, heißt das nicht, dass Sie sie verschachteln. Um das zu erreichen, was Sie beabsichtigten, sollten Sie in Ihrer Definition des Tupels explizit sein. Wenn Sie die pair Initialisierung dies zu ändern:

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

(Beachten Sie das Komma vor der letzten schließenden Klammer)

Jetzt würde Ihre Iteration arbeiten. Als erstes Element ist ('test (.*)', ('a', 'b')) und nicht nur die Zeichenkette test (.*)

Ich hoffe, dies erklärt die Ursache des Fehlers.

+0

danke das hat wirklich geholfen! –

+0

ich dachte nie, dass Komma ein Problem sein würde –

+0

es funktioniert nicht, wenn ich es an ein vorhandenes Tuple anschließe –

1

Die akzeptierte Antwort ist genau über die Quelle des Problems, aber es lässt ein wichtiges Detail aus: Python-Stil schreibt vor, dass Sie use tuples only for collections in which each element has a specific role. Für undifferenzierte Sammlungen verwenden Sie list (eckige Klammern). Jedes der Tupel, die Sie in der Liste pair übergeben, ist ein Paar (<regexp>, <data>) und daher korrekt als tuple geschrieben. Aber pair selbst ist nur eine Sammlung solcher Tupel, und sollte als eine Liste geschrieben werden, nicht als Tupel. Als Bonus sind Liste Klammern eindeutig und Sie müssen nicht hinzufügen erinnern, nur ein Komma, wenn die Liste ein Element hat:

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

das Problem ist, meine Daten an vorhandene Datenstruktur anzuhängen, also habe ich es so! –

+0

Nein tun Sie nicht. Sie können _anything_ an ein Tupel, don sogar nicht sogar anhängen wusstest du das? – alexis

+0

ich habe es zusammengelegt .. wie ich eine neue Datenstruktur dafür erstellt habe, weil das Paket, das ich benutze es ist, wie es in einer solchen Weise benötigt –

Verwandte Themen