Try building an inverse index, and then you can pick whichever keywords you like. This approach ignores word order:
index = {}
for sentence in sentence_list:
for word in set(sentence.split()):
index.setdefault(word, set()).add(sentence)
Or this approach, which keys the index by all possible full-word phrase prefixes:
index = {}
for sentence in sentence_list:
number_of_words = length(sentence.split())
for i in xrange(1, number_of_words):
key_phrase = sentence.rsplit(maxsplit=i)[0]
index.setdefault(key_phrase, set()).add(sentence)
And then if you want to find all of the sentences that contain a keyword (or start with a phrase, if that's your index):
match_sentences = index[key_term]
Or a given set of keywords:
matching_sentences = reduce(list_of_keywords[1:], lambda x, y: x & index[y], initializer = index[list_of_keywords[0]])
Now you can generate a list grouped by pretty much any combination of terms or phrases by building a list comprehension using those indices to generate sentences. E.g., if you built the phrase prefix index and want everything grouped by the first two word phrase:
return [list(index[k]) for k in index if len(k.split()) == 2]