2013-02-09 3 views
0

У меня две строки в двух разных списках A = [dog bit dog null] и B = [hund bet hund]. Я хотел бы, чтобы найти все возможное allignments из списка В в список А, таких как:Возможные выравнивания двух списков с использованием Python

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.. ] 

Я думаю, что есть 64 различные allignments между этими двумя строками. Я работаю над IBM model1 для word translastion.

ответ

0

Если вы хотите 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 дважды в 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')]] 
+0

Важно, чтобы я сохранил дубликаты. –

+0

Я сделал продукт (A, repeat = len (B)), и он сработал! Спасибо! –

0
[(i,j) for i in a for j in b] 

Вы не можете иметь эту структуру в списке, вы бы нужен словарь, я использую кортеж здесь, чтобы связать значение.

+0

Это результаты: [(u'hund ', u'dog'), (u'hund ', u'bit'), (u'hund ', u'dog'), (u'hund ', u' null '), (u'bet', u'dog '), (u'bet', u'bit '), (u'bet', u'dog '), (u'bet', u'null '), (u'hund ', u'dog'), (u'hund ', u'bit'), (u'hund ', u'dog'), (u'hund ', u'null')] Но я хочу иметь кортеж для каждого возможного выравнивания из одного списка в другой. –

+0

Разве это не то, что вы хотели? – LtWorf

+0

Нет, я хочу повесить = собака, bet = dog, hung = hund в одном кортеже –

Смежные вопросы