0

2つの異なるリストに2つの文字列がA = [dog bit dog null]ありB = [hund bet hund]ます。リストBからリストAまでの可能なすべてのアラインメントを見つけたいと思います。

  C =  [(hund = dog, bet = bit, hund = dog),
        (hund = dog, bet = bit, hund = bit),
        (hund = dog, bet = bit, hund = null),
        (hund = dog, bet = dog, hund = dog),
        (hund = dog, bet = dog, hund = bit),
        etc.. ]

これらの2つのストリングの間には64の異なるアラインメントがあると思います。私は単語変換のためのIBMmodel1に取り組んでいます。

4

2 に答える 2

1

64の可能性が必要な場合は、次を使用できますitertools.product

>>> from itertools import product
>>> A = "dog bit dog null".split()
>>> B = "hund bet hund".split()
>>> product(A, repeat=3)
<itertools.product object at 0x1148fd500>
>>> len(list(product(A, repeat=3)))
64
>>> list(product(A, repeat=3))[:5]
[('dog', 'dog', 'dog'), ('dog', 'dog', 'bit'), ('dog', 'dog', 'dog'), ('dog', 'dog', 'null'), ('dog', 'bit', 'dog')]

dogただし、次の場所に2回ある場合、これによりかなりの数の重複が生成されることに注意してくださいA

>>> len(set(product(A, repeat=3)))
27

必要に応じて、関連するペアのトリプレットを取得することもできます。

>>> trips = [zip(B, p) for p in product(A, repeat=len(B))]
>>> trips[:5]
[[('hund', 'dog'), ('bet', 'dog'), ('hund', 'dog')], [('hund', 'dog'), ('bet', 'dog'), ('hund', 'bit')], [('hund', 'dog'), ('bet', 'dog'), ('hund', 'dog')], [('hund', 'dog'), ('bet', 'dog'), ('hund', 'null')], [('hund', 'dog'), ('bet', 'bit'), ('hund', 'dog')]]
于 2013-02-09T20:13:08.583 に答える
0
[(i,j) for i in a for j in b]

リストにその構造を含めることはできません。辞書が必要です。ここではタプルを使用して値を関連付けています。

于 2013-02-09T20:09:10.757 に答える