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
Gerade Doppelprüf; '" snowflake "' würde True nicht zurückgeben, weil "flake" nicht im Wortsatz ist, oder? –