2016-11-28 2 views
0

я написал небольшую функцию, которая выводит комбинацию:Уникальные комбинации длина 2 из двух строк с использованием рекурсии

def get_data(str1, str2): 
    if len(str1) == 0 or len(str2) == 0: 
     return 
    print str1[0], str2[0] 
    get_data(str1[1:], str2) 
    get_data(str1, str2[1:]) 


get_data("stu", "wxyz") 

я получаю выход как:

s w 
t w 
u w 
u x 
u y 
u z 
t x 
u x 
u y 
u z 
t y 
u y 
u z 
t z 
u z 
s x 
t x 
u x 
u y 
u z 
t y 
u y 
u z 
t z 
u z 
s y 
t y 
u y 
u z 
t z 
u z 
s z 
t z 
u z 

Выхода имеет много повторяющиеся пары. Как я могу получить только уникальные значения?

+0

Я подозреваю, что это просто упражнение. Но если нет, обязательно проверьте «продукт»: 'от продукта импорта itertools'. Затем: 'list (product (" stu "," wxyz "))' дает '[('s', 'w'), ('s', 'x'), ('s', 'y'), ('s', 'z'), ('t', 'w'), ('t', 'x'), ('t', 'y'), ('t', 'z'), ('u', 'w'), ('u', 'x'), ('u', 'y'), ('u', 'z')] '. –

ответ

1

Есть ли что-то не так с простой петлей?

def get_data(str1, str2): 
    for char in str1: 
     for char2 in str2: 
      print char, char2 


get_data("stu", "wxyz") 

выход:

s w 
s x 
s y 
s z 
t w 
t x 
t y 
t z 
u w 
u x 
u y 
u z 
0

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

Вот более простая версия с использованием петель. Единственность очевидна, по крайней мере, если ни один символ не повторяется ни в одной строке. Это также хорошо работает для других типов данных, таких как два списка.

def getdata(str1, str2): 
    for s1 in str1: 
     for s2 in str2: 
      print(s1, s2) 

getdata("stu", "wxyz") 

Это печатает то, что вы хотите:

s w 
s x 
s y 
s z 
t w 
t x 
t y 
t z 
u w 
u x 
u y 
u z 

Обратите внимание, что мой код для Python 3: использовать его в Python 2 просто удалить окружающие скобки в print заявлении, или импортировать печать от будущего.

0

Если вы настаиваете на рекурсии:

def get_data(s1,s2): 
    get_data_helper(s1, s2, s2) 

def get_data_helper(s1,s2,s2full): 
'''Print all combinations of s1[0] w/ s2, followed by all combinations from s1[1:] with s2full 
    s2 is a suffix of s2full''' 
    if s1=="": 
     return 
    if s2=="": 
     get_data_helper(s1[1:],s2full,s2full) 
    else: 
     print s1[0], s2[0] 
     get_data_helper(s1, s2[1:], s2full) 
0

Python имеет прекрасные инструменты для различных итераций, в пакете itertools. Тот, который вам нужен, это продукт, декартовый продукт набора истребимых предметов.

Я добавил join -with-space, чтобы получить результат в исходном формате. Вы также можете просто использовать упорядоченную пару символов.

import itertools 
def get_data(str1, str2): 
    for combo in itertools.product(str1, str2): 
     print ' '.join(combo) 

get_data("stu", "wxyz") 

Выход:

s w 
s x 
s y 
s z 
t w 
t x 
t y 
t z 
u w 
u x 
u y 
u z 
Смежные вопросы