2016-11-14 7 views
2

リスト/セットと文字列を取り込むコードを書いて、リストにある2つの単語に文字列を分割することができれば返す。私は私が近づいていることを知っている、私はちょうど比較右または何かを得ることはできません。タプルを非タプルのリストと比較する

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

は、Trueを返します。

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: 

ここで私は今どこに行くべきかわかりません。

+0

だけdoublecheckすると例です。 '' snowflake ''は' 'flake' 'が単語集合にないので真を返しません。 –

答えて

2

その後、あなたのwordset1セットのサブセットあるタプルにそのリストをフィルタリングし、タプルとしてではなく、スペースで区切られた1つの文字列として、あなたの単語ペアを追加します。

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

私はここset.issuperset() methodを使用;引数iterableのすべての要素がセットに存在する場合はTrueを返します。したがって、タプルの両方の要素が存在する場合にのみTrueを返します。

のみその後、単一の文字列に単語を組み合わせて:あなたは本当に、これらの中間のリストを必要としない

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

。あなただけTrueを返すように関数のサブセットです任意のなタプルがあるかどうか確認する必要があり:

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

私はジェネレータ式にbreakupを回しました。早い段階で一致する単語対を見つけることができれば、リスト全体を構築する必要はありません。 any() functionは、反復される値の1つが真であるとすぐにTrueを返します。これもジェネレータ式なので、一致が見つかるまで、単語のペアを遅延テストします。

デモ:ここ

>>> 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

あなたは実際に真または偽を印刷していますか?私のちょうど終了は終了コード0で終了します。私は知っている、ダムの質問。ちょうど私の頭の中でラップしようとしています。実際には最新の編集内容を読んでください。すべて今クリア!これには17の親指が必要です。 thx –

+0

@KelvinDavis:関数*はブール値を返します。もしあなたがその値を出力することになっていたら、 'print()'を追加してください。 –

0

が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']) 

+1

「words」に1000語のアルゴリズムを試してみてください。 :) –

+0

:)確かに、len(単語)<3000 –

関連する問題