2014-10-31 2 views
1

У меня есть два разных списка: list1 = ['A','B'] и list2 = ['C','D','E']. Я хотел бы найти все возможные сокращения между элементами этих двух списков. В данном случае я хотел бы иметь код (желательно Python, Mathematica или MATLAB), который принимает списки выше и возвращает:Подрядные элементы из двух разных списков

AC,BD, AC,BE, AD,BC, AD,BE, AE,BC, AE,BD

, которые все возможные сокращения. Я хотел бы иметь возможность сделать это для списков переменного размера (но всегда 2 из них). Я много играл с itertools Python, но я не могу понять, как он работает с двумя списками. Любая помощь приветствуется.

+0

Вы имеете в виду все перестановки list1 конкатенации с list2 на общую длину слова каждой перестановки как 2? EDIT: Второй вопрос ... вы ищете слово 2, зависящее от того, что было выбрано в слове 1? –

ответ

1

Вот моя версия:

import itertools 

l1 = 'AB' 
l2 = 'CDE' 

n = min(len(l1),len(l2)) 
print('; '.join(
    ','.join(a+b for a,b in zip(s1,s2)) 
    for s1,s2 in itertools.product(
     itertools.permutations(l1,n), 
     itertools.combinations(l2,n), 
    ) 
)) 

Этот выход будет:

AC,BD; AC,BE; AD,BE; BC,AD; BC,AE; BD,AE 

Обратите внимание, что для краткости, я не создать список элементов, а непосредственно итерацию строки. Не имеет значения, какой из двух списков получает permutations и который получает combinations, что просто изменяет порядок вывода. permutations принимает все возможные заказы, а combinations возвращает отсортированные заказы. Таким образом, вы получаете каждое сокращение ровно один раз.

Для каждого сокращения вы получите две последовательности: s1 и s2, сокращение между элементами одинакового индекса в каждой последовательности. ','.join(a+b for a,b in zip(s1,s2)) делает хорошую строку для такого сокращения.

+0

Большое спасибо. Это и есть. Математический вопрос ниже не делает то, что я хочу, когда добавляю больше элементов ... – deyan

0

Если вы спрашиваете о том, как построить все перестановки элементов, содержащихся в обоих списках, без повторов, с каждым результатом длины два, вы могли бы использовать itertools.permutation:

combined_list = [] 
for i in list1 + list2: 
    if i not in combined_list: 
     combined_list.append(i) 

for perm in itertools.permutations(combined_list, 2): 
    print(perm) 

Для входы песни1 = [ 'а', 'б'] и песни2 = [ 'C', 'D', 'е'], эти выходы:

('a', 'b') ('a', 'c') ('a', 'd') ('a', 'e') ('b', 'a') ('b', 'c') ('b', 'd') ('b', 'e') ('c', 'a') ('c', 'b') ('c', 'd') ('c', 'e') ('d', 'a') ('d', 'b') ('d', 'c') ('d', 'e') ('e', 'a') ('e', 'b') ('e', 'c') ('e', 'd') 
+0

все еще неправильно, list.extend ничего не возвращает ... – burnpanck

+0

@burnpanck Спасибо, исправлено. – furkle

+0

@burnpanck Я полностью смущен насчет цели расширения? Я мог бы поклясться, основываясь на использовании, документации и SO-ответах, которые я видел, что это объединенные списки. – furkle

0
In [2]: list1 = ['A','B'] 

In [3]: list2 = ['C','D','E'] 

In [4]: list(itertools.product(list1, list2)) 
Out[4]: [('A', 'C'), ('A', 'D'), ('A', 'E'), ('B', 'C'), ('B', 'D'), ('B', 'E')] 

In [5]: [''.join(p) for p in itertools.product(list1, list2)] 
Out[5]: ['AC', 'AD', 'AE', 'BC', 'BD', 'BE'] 
Смежные вопросы