有点python newb在这里试图弄清楚为什么我的代码没有给出预期的结果。首先是代码:
from itertools import permutations
word_list = ['eggs', ',', 'bacon', ',', 'chicken', ',', 'cheese', 'and', 'tomatoes']
grammar_list = ['NOUN', ',', 'NOUN', ',', 'NOUN', ',', 'NOUN', 'AND', 'NOUN']
def permute_nouns():
permuted_list = []
comma_AND_indices = [index for index, p in enumerate(grammar_list) if p == "," or p == "AND"]
# so 'comma_AND_indices' = [1, 3, 5, 7]
for perm in permutations(word_list):
observed_comma_AND_indices = [index for index, p in enumerate(perm) if p == "," or p == "and"]
if comma_AND_indices == observed_comma_AND_indices:
# what goes wrong here? not matches from list compare above still get appended below.
permuted_list.append(perm)
print permuted_list
permute_nouns()
在这个函数中,我使用itertools permutations方法来创建word_list
的排列。但是,我不想要所有的排列。我只想要逗号和单词'和'在word_list
中保持其原始位置/索引的排列,并将这些排列附加到permuted_list
。
我正在使用代码行if comma_AND_indices == observed_comma_AND_indices:
来过滤掉我不想要的那些排列,但它不起作用,我不明白为什么。在打印出permuted_list
时,我发现不会保留逗号和“和”,但会附加所有排列。
(您可能想知道为什么在函数中使用grammar_list
会感到烦恼,但这里的代码是稍微大一点的脚本的一部分,其中grammar_list
扮演其角色)
任何有助于对此表示赞赏的帮助。
的Darren
编辑:这是一个打印出来的样本:
[('eggs', ',', 'bacon', ',', 'chicken', ',', 'cheese', 'and', 'tomatoes'), ('eggs', ',', 'bacon', ',', 'chicken', ',', 'tomatoes', 'and', 'cheese'), ('eggs', ',', 'bacon', ',', 'chicken', 'and', 'cheese', ',', 'tomatoes'), ('eggs', ',', 'bacon', ',', 'chicken', 'and', 'tomatoes', ',', 'cheese'), ('eggs', ',', 'bacon', ',', 'cheese', ',', 'chicken', 'and', 'tomatoes'), ('eggs', ',', 'bacon', ',', 'cheese', ',', 'tomatoes', 'and', 'chicken'), ('eggs', ',', 'bacon', ',', 'cheese', 'and', 'chicken', ',', 'tomatoes'), ('eggs', ',', 'bacon', ',', 'cheese', 'and', 'tomatoes', ',', 'chicken'), ('eggs', ',', 'bacon', ',', 'tomatoes', ',', 'chicken', 'and', 'cheese'), ('eggs', ',', 'bacon', ',', 'tomatoes', ',', 'cheese', 'and', 'chicken'), ('eggs', ',', 'bacon', ',', 'tomatoes', 'and', 'chicken', ',', 'cheese'), ('eggs', ',', 'bacon', ',', 'tomatoes', 'and', 'cheese', ',', 'chicken'), ('eggs', ',', 'bacon', ',', 'chicken', ',', 'cheese', 'and', 'tomatoes'), ('eggs', ',', 'bacon', ',', 'chicken', ',', 'tomatoes', 'and', 'cheese'), ('eggs', ',', 'bacon', ',', 'chicken', 'and', 'cheese', ',', 'tomatoes'), ('eggs', ',', 'bacon', ',', 'chicken', 'and', 'tomatoes', ',', 'cheese'), ('eggs', ',', 'bacon', ',', 'cheese', ',', 'chicken', 'and', 'tomatoes'), ('eggs', ',', 'bacon', ',', 'cheese', ',', 'tomatoes', 'and', 'chicken'), ('eggs', ',', 'bacon', ',', 'cheese', 'and', 'chicken', ',', 'tomatoes'), ('eggs', ',', 'bacon', ',', 'cheese', 'and', 'tomatoes', ',', 'chicken'), ('eggs', ',', 'bacon', ',', 'tomatoes', ',', 'chicken', 'and', 'cheese'), ('eggs', ',', 'bacon', ',', 'tomatoes', ',', 'cheese', 'and', 'chicken'), ('eggs', ',', 'bacon', ',', 'tomatoes', 'and', 'chicken', ',', 'cheese'), ('eggs', ',', 'bacon', ',', 'tomatoes', 'and', 'cheese', ',', 'chicken'), ('eggs', ',', 'bacon', 'and', 'chicken', ',', 'cheese', ',', 'tomatoes'), ('eggs', ',', 'bacon', 'and', 'chicken', ',', 'tomatoes', ',', 'cheese'), ('eggs', ',', 'bacon', 'and', 'chicken', ',', 'cheese', ',', 'tomatoes'), ('eggs', ',', 'bacon', 'and', 'chicken', ',', 'tomatoes', ',', 'cheese'), ('eggs', ',', 'bacon', 'and', 'cheese', ',', 'chicken', ',', 'tomatoes'), ('eggs', ',', 'bacon', 'and', 'cheese', ',', 'tomatoes', ',', 'chicken'), ('eggs', ',', 'bacon', 'and', 'cheese', ',', 'chicken', ',', 'tomatoes'), ('eggs', ',', 'bacon', 'and', 'cheese', ',', 'tomatoes', ',', 'chicken'), ('eggs', ',', 'bacon', 'and', 'tomatoes', ',', 'chicken', ',', 'cheese'), ('eggs', ',', 'bacon', 'and', 'tomatoes', ',', 'cheese', ',', 'chicken'), ('eggs', ',', 'bacon', 'and', 'tomatoes', ',', 'chicken', ',', 'cheese'), ('eggs', ',', 'bacon', 'and', 'tomatoes', ',', 'cheese', ',', 'chicken'), ('eggs', ',', 'chicken', ',', 'bacon', ',', 'cheese', 'and', 'tomatoes'), ('eggs', ',', 'chicken', ',', 'bacon', ',', 'tomatoes', 'and', 'cheese'), ('eggs', ',', 'chicken', ',', 'bacon', 'and', 'cheese', ',', 'tomatoes'), ('eggs', ',', 'chicken', ',', 'bacon', 'and', 'tomatoes', ',', 'cheese'), ('eggs', ',', 'chicken', ',', 'cheese', ',', 'bacon', 'and', 'tomatoes'), ('eggs', ',', 'chicken', ',', 'cheese', ',', 'tomatoes', 'and', 'bacon'), ('eggs', ',', 'chicken', ',', 'cheese', 'and', 'bacon', ',', 'tomatoes'), ('eggs', ',', 'chicken', ',', 'cheese', 'and', 'tomatoes', ',', 'bacon'), ('eggs', ',', 'chicken', ',', 'tomatoes', ',', 'bacon', 'and', 'cheese'), ('eggs', ',', 'chicken', ',', 'tomatoes', ',', 'cheese', 'and', 'bacon'), ('eggs', ',', 'chicken', ',', 'tomatoes', 'and', 'bacon', ',', 'cheese'), ('eggs', ',', 'chicken', ',', 'tomatoes', 'and', 'cheese', ',', 'bacon'), ('eggs', ',', 'chicken', ',', 'bacon', ',', 'cheese', 'and', 'tomatoes'), ('eggs', ',', 'chicken', ',', 'bacon', ',', 'tomatoes', 'and', 'cheese'), ('eggs', ',', 'chicken', ',', 'bacon', 'and', 'cheese', ',', 'tomatoes'), ('eggs', ',', 'chicken', ',', 'bacon', 'and', 'tomatoes', ',', 'cheese'), ('eggs', ',', 'chicken', ',', 'cheese', ',', 'bacon', 'and', 'tomatoes'), ('eggs', ',', 'chicken', ',', 'cheese', ',', 'tomatoes', 'and', 'bacon'), ('eggs', ',', 'chicken', ',', 'cheese', 'and', 'bacon', ',', 'tomatoes'),
答案 0 :(得分:1)
您的代码工作得很好,尽管您可以更加简洁地生成相同的列表,product()
和[','] + 3 + ['and']
的排列[w for w in word_list if w not in (',', 'and')]
,生成相同的120 * 24 = 2880种组合。
如果您只期望120个结果,那么您忘记了您没有在输出中测试3个逗号和单词'and'
的顺序;允许该列表有24种不同的排列:
>>> len(list(permutations([','] * 3 + ['and'])))
24
换句话说,对于名词的任何给定排列,你使用3个逗号和单词and
在不同位置产生24个变体的句子。
仅生成120种名词组合:
nouns = [w for w in word_list if w not in (',', 'and')]
grammar = [w for w in word_list if w in (',', 'and')]
result = []
for perm in permutations(nouns):
result.append([w for word, g in map(None, perm, grammar) for w in (word, g) if w is not None])
答案 1 :(得分:1)
如果重复无关紧要,您可以使用itertools.product
:
for words in itertools.product(*(['a'], ['big', 'fat'], ['dog', 'house'])):
print(' '.join(words))
打印哪些:
a big dog
a big house
a fat dog
a fat house
但是既然他们这样做了,你就必须做一些更复杂的事情:
import itertools
import collections
grammar = ['NOUN', ',', 'NOUN', ',', 'NOUN', ',', 'NOUN', 'AND', 'NOUN']
parts_of_speech = {
'NOUN': ['eggs', 'bacon', 'chicken', 'cheese', 'tomatoes'],
'AND': ['and'],
',': [',']
}
def partial_sentences(words, indices, sentence_length):
if len(indices) > len(words):
orderings = itertools.product(words, repeat=len(indices))
else:
orderings = itertools.permutations(words, len(indices))
for words in orderings:
sentence = [None] * sentence_length
for index, word in zip(indices, words):
sentence[index] = word
yield sentence
def pos_stacks(parts_of_speech, grammar):
positions = collections.defaultdict(list)
for index, pos in enumerate(grammar):
positions[pos].append(index)
for pos, indices in positions.items():
yield partial_sentences(parts_of_speech[pos], indices, len(grammar))
for result in itertools.product(*pos_stacks(parts_of_speech, grammar)):
sentence = [next(itertools.ifilter(bool, words)) for words in zip(*result)]
print(sentence)
它基本上可以在正确的位置创建所有可能的单词排序,循环遍历所有的词性,并将句子“叠加”在一起。