8

リストのすべての順列を生成し、それぞれが辞書にあるかどうかを確認するためのより高速な方法が必要です。

        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の使用をやめる必要があるかもしれませんが、最初に専門家がPythonを実行すると思いました。

最高、ゲイリー

4

5 に答える 5

5

非常に基本的な最適化:

permutations = list(itertools.permutations(bag,x))
for item in permutations:

になることができる...

for item in itertools.permutations(bag,x):
于 2010-09-22T06:03:50.533 に答える
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必要に応じてそれぞれを生成するだけで役立ちます。

さらに重要なことに、ジェネレータ式に主な努力を注ぎ込み、必要に応じて値を生成させることができます。

于 2010-09-22T06:05:00.493 に答える
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

このようにして、大きな(そして大きくなる)リストがなく、関数から渡されるコンボを生成するだけです。

于 2010-09-22T07:26:06.400 に答える
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)
于 2010-09-22T08:36:52.820 に答える
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)
于 2010-09-22T06:29:07.313 に答える