写下面的代码来接受列表/集合和字符串,如果我能够将字符串分成列表中的两个单词,那么我将返回。我知道我很接近,我只是无法得到正确的比较。
e.g。
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 :(得分:2)
将单词对添加为元组,而不是空格分隔的单个字符串,然后在wordset1
集的子集元组上过滤该列表:
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就会返回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
答案 1 :(得分: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'])
真