Python - 加快列表排列的生成(以及检查Dict中是否存在排列的过程)

时间:2010-09-22 05:55:51

标签: python list dictionary permutation itertools

我需要一种更快的方法来生成列表的所有排列,然后检查每个排列是否都在字典中。

        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,但我认为我会先由你的专家运行它!

最佳, 加里

5 个答案:

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