我需要一种更快的方法来生成列表的所有排列,然后检查每个排列是否都在字典中。
for x in range (max_combo_len, 0, -1):
possible_combos = []
permutations = list(itertools.permutations(bag,x))
for item in permutations:
possible_combos.append(" ".join(item))
#then check to see if each possible combo is in a specific Dict
如果有帮助,列表都将成为字符串列表。 ['比如','this','one']
我的解决方案有效,但速度很慢。可能是我需要停止使用Python,但我认为我会先由你的专家运行它!
最佳, 加里
答案 0 :(得分:5)
非常基本的优化:
permutations = list(itertools.permutations(bag,x))
for item in permutations:
可以成为......
for item in itertools.permutations(bag,x):
答案 1 :(得分:1)
如果没有更好的输入案例,我无法很好地测试它,但这里有一些改进:
for x in xrange(max_combo_len, 0, -1):
possible_combos = (" ".join(item) for item in itertools.permutations(bag,x))
#then check to see if each possible combo is in a specific Dict
combos = (c for c in possible_combos if c in specific_dict)
首先,假设您使用的是Python 2.x,xrange
将有助于不构建显式列表,而只是根据需要生成每个x
。
更重要的是,您可以将主要工作投入到生成器表达式中,并使其按需生成值。
答案 2 :(得分:1)
for x in xrange(max_combo_len, 0, -1):
for item in itertools.permutations(bag,x):
combo = " ".join(item)
if combo in specificDict:
yield combo
这样你就没有任何大型(并且越来越大)的列表,你只需从函数中输出传递的comobs。
答案 3 :(得分:1)
如果你准备了特殊的dict,你可以摆脱许多无用(抛弃)的连接操作:根据你的比较分割值或键。这当然假设dict小于所有组合的数量。
如果您需要加入,则必须略微改变这一点。我想而你没有更具描述性,问题没有比这更好的优化。而使用另一种语言并不会快得多。
(filtered_combo for filtered_combo in
itertools.chain.from_iterable(
combo for combo in (itertools.permutations(bag, x)
for x in xrange(max_combo_len, 0, -1)))
if filtered_combo in special_dict)
答案 4 :(得分:0)
这样的东西?
sentences = ['such as', 'this', 'ten eggs', 'one book', 'six eggs']
bag_of_words = set(['such', 'one','ten','book','eggs'])
possible = [sentence
for sentence in sentences
if all(word in bag_of_words for word in sentence.split())
]
print 'Possible to produce from bag words are:\n\t%s' % '\n\t'.join(possible)