2014-02-19 6 views
0

Я уже делал этот алгоритм в школе, но я забыл, как это сделать. В основном я хочу, чтобы вернуть результат, которые являются строки, как 'в [0]', 'в [0] .a [0]' ...Алгоритм подстановки подстановки в Python и печатных строках

length = range(0,2) #length = 2 
depth = range(0,3) #depth = 3 

for i in length: 
    for k in depth: 
     … print each permutation 

РЕЗУЛЬТАТ

a[0] 
a[0].a[0] 
a[0].a[1] 
a[0].a[0].a[0] 
a[0].a[0].a[1] 
a[0].a[1].a[0] 
a[0].a[1].a[1] 
a[1] 
a[1].a[0] 
a[1].a[1] 
a[1].a[0].a[0] 
a[1].a[0].a[1] 
a[1].a[1].a[0] 
a[1].a[1].a[1] 
+0

Если изменить длину или глубину, так что они не равны, то что же результаты выглядят? –

+0

Какова логика в упорядочении результата? Почему 'a [0]' и 'a [1]' разделены дочерними элементами 'a [0]', но в то же время 'a [2] .a [0]' непосредственно сопровождается 'a [2 ] .a [1] 'и дети приходят после них? – Hyperboreus

+0

Извините, я изменил его для этой путаницы. – chimpsarehungry

ответ

2

Изменение немного упорядочение производства, так что это одно и то же на всех уровнях:

def thing (length, depth, prefix = None): 
    if not depth: return 
    if not prefix: prefix = [] 
    for l in range (length): 
     r = prefix + ['a[{}]'.format (l) ] 
     yield '.'.join (r) 
     for r in thing (length, depth - 1, r): 
      yield r 

for x in thing (2, 3): print (x) 

выход:

a[0] 
a[0].a[0] 
a[0].a[0].a[0] 
a[0].a[0].a[1] 
a[0].a[1] 
a[0].a[1].a[0] 
a[0].a[1].a[1] 
a[1] 
a[1].a[0] 
a[1].a[0].a[0] 
a[1].a[0].a[1] 
a[1].a[1] 
a[1].a[1].a[0] 
a[1].a[1].a[1] 
+0

Отличная кодировка, которую вы действительно взбивали – chimpsarehungry

+0

Что это за функция – chimpsarehungry

+0

Генератор. Что-то вроде обычной, но не совсем. – Hyperboreus

1

Альтернативный подход; как указывает Гипербореус, ключ понимает, что упорядочение первых элементов не соответствует порядку следующих элементов; поэтому я обрабатываю их отдельно.

from itertools import product 

def item_fmt(i): 
    return "a[{}]".format(repr(i)) 

def make_result(*args): 
    return ".".join(item_fmt(arg) for arg in args) 

def main(): 
    items = [0, 1] 
    maxdepth = 3 

    for first in items:    # in order by first-item 
     print(make_result(first)) # show first-item-only 
     for depth in range(1, maxdepth):    # in order by depth 
      for combo in product(items, repeat=depth): # generate all combinations of given depth 
       print(make_result(first, *combo)) 

if __name__=="__main__": 
    main() 

приводит

a[0] 
a[0].a[0] 
a[0].a[1] 
a[0].a[0].a[0] 
a[0].a[0].a[1] 
a[0].a[1].a[0] 
a[0].a[1].a[1] 
a[1] 
a[1].a[0] 
a[1].a[1] 
a[1].a[0].a[0] 
a[1].a[0].a[1] 
a[1].a[1].a[0] 
a[1].a[1].a[1] 
Смежные вопросы