2016-07-25 2 views
-5

так что я хочу понять концепцию функции product() в itertools. Я имею в виду, что отличает доходность и доходность. И пусть этот код будет сокращен в любом случае.Принцип работы продукта itertools Функция

def product1(*args, **kwds): 
     pools = map(tuple, args) * kwds.get('repeat', 1) 
     n = len(pools) 
     if n == 0: 
      yield() 
      return 
     if any(len(pool) == 0 for pool in pools): 
      return 
     indices = [0] * n 
     yield tuple(pool[i] for pool, i in zip(pools, indices)) 
     while 1: 
      for i in reversed(range(n)): # right to left 
       if indices[i] == len(pools[i]) - 1: 
        continue 
       indices[i] += 1 
       for j in range(i+1, n): 
        indices[j] = 0 
       yield tuple(pool[i] for pool, i in zip(pools, indices)) 
       break 
      else: 
       return 
+2

Похоже, что вы хотите, чтобы мы написали код для вы. Хотя многие пользователи готовы создавать код для кодера, терпящего бедствие, они обычно помогают только тогда, когда плакат уже попытался решить проблему самостоятельно. Хорошим способом продемонстрировать это усилие является включение кода, который вы написали до сих пор, пример ввода (если есть), ожидаемый вывод и вывод, который вы фактически получаете (вывод, трассировка и т. Д.). Чем больше деталей вы предоставляете, тем больше ответов вы получите.Проверьте [FAQ] (http://stackoverflow.com/tour) и [Как спросить] (http://stackoverflow.com/questions/how-to-ask). – TigerhawkT3

+0

Без 'itertools'? Тогда я думаю, что это петли. есть ли причина, по которой вы не будете использовать 'itertools'? или это больше похоже на вызов для самого себя? – pwnsauce

+2

1. Напишите код, используя itertools. 2. Перейдите в документацию itertools. Для каждой используемой функции найдите «эта функция, эквивалентная следующему коду:». 3. Скопируйте эти блоки в свой код. – Kevin

ответ

0

Этот код должен делать свою работу:

bytes = [i for i in range(2**(n))] 
AB= [] 
for obj in bytes: 
    t = str(bin(obj))[2:] 
    t= '0'*(n-len(t)) + t 
    AB.append(t.replace('0','A').replace('1','B')) 

н бытии требуется размер строки

1

Я настоятельно рекомендую использовать хорошо установлены и испытаны itertoolsstandard module. Переосмыслить колесо никогда не целесообразно как программист. Тем не менее, я бы начал с рассмотрения функции product() в itertools.

Как не использовать itertools(), эта проблема является по существу декартово произведение задача (п-подстановки с дубликатами разрешено). Здесь рекурсия помогает нам! Одно из возможных решений ниже:

тело Метод:

result = [] 
def permutations(alphabet, repeat, total = ''): 
    if repeat >= 1: 
     for i in alphabet: 
      # Add the subsolutions.  
      permutations(alphabet, repeat - 1, total + i) 

    else: 
     result.append(total) 
    return result 

И когда мы называем с permutations()

Sample Выходы:

permutations('ab', 3) -> 
$ ['aaa', 'aab', 'aba', 'abb', 'baa', 'bab', 'bba', 'bbb'] 
permutations('ab', 3) -> 
$ ['aaa', 'aab', 'aac', 'aba', 'abb', 'abc', 'aca', 'acb', 'acc', 'baa', 
    'bab', 'bac', 'bba', 'bbb', 'bbc', 'bca', 'bcb', 'bcc', 'caa', 'cab', 
    'cac', 'cba', 'cbb', 'cbc', 'cca', 'ccb', 'ccc'] 
permutations('ab', 1) -> 
$ ['a', 'b'] 

Как это работает?

Этот метод работает путем вложения в петли рекурсивным способом repeat -times. Затем мы накапливаем результат подрешений, добавляя к списку результатов. Так что, если мы используем как наш повтор значения, из расширили итерационный след этой задачи будет выглядеть следующим образом:

for i in alphabet: 
    for j in alphabet: 
     for k in alphabet: 
      for l in alphabet: 
       result.append(i + j + k + l) 
+0

Это комментарий, а не ответ. –

+0

@JohnColeman Добавлен ответ! Надеюсь, вы измените свое мнение о нисходящем направлении: D – ospahiu

+1

Нет проблем - хотя вы могли только что опубликовать новый ответ. Черт возьми, я даже подниму его. –

0

Сначала создайте список со всеми возможными аранжировками, что легко достижимо путем суммирования двоичных файлов:

def generate_arrangements(n): 
    return [bin(i)[2:].zfill(n) for i in range(2**n)] # 2**n is number of possible options (A,B) n times 

[2:] разрезает строку и удаляет из нее '0b', а zfill (n) завершает строку с 0s до тех пор, пока строка не будет иметь длину n.

Теперь замените все 0,1 на A, B соответственно:

arrangements = [arrangement.replace('0', 'A').replace('1', 'B') for arrangement in generate_arrangements(3)] 
print(arrangements) 
>> ['AAA', 'AAB', 'ABA', 'ABB', 'BAA', 'BAB', 'BBA', 'BBB'] 

Если вы хотите поставить все вместе у вас есть:

def generateAB(n): 
    arrangements = [bin(i)[2:].zfill(n) for i in range(2**n)] 
    return [arrangement.replace('0', 'A').replace('1', 'B') for arrangement in arrangements] 
Смежные вопросы