将元组与非元组列表进行比较

时间:2016-11-14 07:39:43

标签: python tuples

写下面的代码来接受列表/集合和字符串,如果我能够将字符串分成列表中的两个单词,那么我将返回。我知道我很接近,我只是无法得到正确的比较。

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:

这是我现在不知道去哪里的地方。

2 个答案:

答案 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'])