2016-11-14 13 views
2

Ich habe den folgenden Code geschrieben, um eine Liste/einen Satz und eine Zeichenfolge aufzunehmen. Wenn ich die Zeichenfolge in zwei Wörter in der Liste aufteilen kann, gebe ich zurück. Ich weiß, dass ich in der Nähe bin, ich kann den Vergleich nicht richtig oder so etwas finden.Tupel mit einer Liste von Nicht-Tupeln vergleichen

z.B.

wordBreakEasy("snowfall", ("apple", "fall", ..., "snow")) 

würde True zurückgeben.

def wordBreakEasy(str1, wordset): 
    wordset1 = set(wordset) 
    breakup = ['%s %s' % (str1[:i], str1[i:]) for i in range(1, len(str1))] 
    newlist = [] 
    for x in breakup: 
    newlist.append((x.split())) 
    wordset2 = set(map(tuple, newlist)) 

    for wordset2 in wordset1: 

Hier weiß ich nicht, wohin ich jetzt gehen soll.

+0

Gerade Doppelprüf; '" snowflake "' würde True nicht zurückgeben, weil "flake" nicht im Wortsatz ist, oder? –

Antwort

2

Fügen Sie Ihre Wortpaare als Tupel, statt als durch Leerzeichen getrennte einzelne Zeichenfolge, dann diese Liste auf Tupel filtern, die eine Teilmenge Ihrer wordset1 Set sind:

breakup = [(str1[:i], str1[i:]) for i in range(1, len(str1))] 
present = [tup for tup in breakup if not wordset1.issuperset(tup)] 

habe ich die hier set.issuperset() method ; Es gibt True zurück, wenn alle Elemente in dem Argument iterable in der Menge vorhanden sind, also wenn True nur zurückgegeben wird, wenn beide Elemente im Tupel vorhanden sind.

Nur dann die Wörter in einer einzigen Zeichenfolge kombinieren:

newlist = [' '.join(tup) for tup in present] 

Sie nicht jene Vermittler Listen benötigen, wirklich; Sie müssen nur dort zu finden, wenn ist jede solche Tupel, die eine Teilmenge für Ihre Funktion True zurückzukehren:

breakup = ((str1[:i], str1[i:]) for i in range(1, len(str1))) 
return any(wordset1.issuperset(tup) for tup in breakup) 

Ich drehte breakup in einen Generator Ausdruck; Es ist nicht nötig, die ganze Liste zu erstellen, wenn Sie schon früh ein passendes Wortpaar finden. Die any() function gibt True zurück, sobald einer der Werte, über die iteriert wird, wahr ist. Da dies auch ein Generatorausdruck ist, testet er wortweise Paare, bis eine Übereinstimmung gefunden wird.

Demo:

>>> def wordBreakEasy(str1, wordset): 
...  wordset1 = set(wordset) 
...  breakup = ((str1[:i], str1[i:]) for i in range(1, len(str1))) 
...  return any(wordset1.issuperset(tup) for tup in breakup) 
... 
>>> wordBreakEasy("snowfall", ("apple", "fall", "...", "snow")) 
True 
>>> wordBreakEasy("snowflake", ("apple", "fall", "...", "snow")) 
False 
+0

Drucken Sie tatsächlich True oder False? Mein kurzes Ende endet mit dem Exit Code 0. Ich weiß, dumme Frage. Ich versuche nur, mir den Kopf zu verdrehen. Lies dir gerade deine letzte Bearbeitung durch. Alles klar jetzt! Dies benötigt 17 Daumen hoch. thx –

+0

@KelvinDavis: Die Funktion * gibt * einen booleschen Wert zurück. Wenn Sie diesen Wert drucken möchten, fügen Sie 'print()' hinzu. –

0

Hier ist ein Beispiel mit itertools.combinations

def word_break(s, words): 
    return (s in map("".join, itertools.combinations(words , 2)) or 
      s in map("".join, itertools.combinations(words[::-1] , 2))) 

word_break('snowfall', ['fall', 'green', 'white', 'cheese', 'snow']) 

Wahr

+1

Versuchen Sie diesen Algorithmus mit 1000 Wörtern in 'words'. :) –

+0

:) zwar, aber es ist immer noch eine schöne Lösung wenn man (Wörter) <3000 –

Verwandte Themen