2012-04-13 2 views
2

У меня есть эти две функции:элементов Python Сравнение последовательностей

def comparison(a, b): 
    return [-1, 0, 1].index(cmp(b, a)) 

def base_3(seq): 
    return [comparison(a, b) for a, b in itertools.combinations(seq, 2)] 

Сравнение функция возвращает число сравнения, основанный на этом:

  1. 0, если а> Ь
  2. 1, если а = Ь
  3. 2, если б <

Функция base_3 возвращает сравнение между всеми объединенными элементами.

Например:

x = [0, 1, 2] 
y = [1, 2, 0] 
z = [0, 1, 0] 

>>> base_3(x) 
[2, 2, 2] 

>>> base_3(y) 
[2, 0, 0] 

>>> base_3(z) 
[2, 1, 0] 

Мне нужна функция, которая возвращает последовательность из заданного base_3, когда это возможно:

>>> base_3_to_seq([2, 2, 2]) 
[0, 1, 2] 

>>> base_3_to_seq([2, 1, 0]) 
[0, 1, 0] 

>>> base_3_to_seq([0, 2, 1]) 
"Impossible" 

Как я могу написать эту функцию base_3_to_seq?

+1

Наблюдение за исходным кодом: '[-1, 0, 1] .index (cmp (b, a))' эквивалентно 'cmp (b, a) + 1'. –

ответ

2

Это перебор путь:

def base_3_to_seq(base3): 
    for seq in itertools.product(range(3), repeat=3): 
     if base_3(seq) == base3: 
      return seq 
    return "Impossible" 

В зависимости от того, какой путь вы вызываете его больше всего, вы могли бы ускорить код вверх для длинных пробегов по memoizing либо base_3 или base_3_to_seq.