2012-04-13 22 views
2

Iは、これらの二つの機能を持っている: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> B
  2. 1場合= bの場合
  3. 2の場合<b

関数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" 

あなたが最も、あなたがbase_3やbase_3_to_seqのいずれかをmemoizingでロングランのコードまでを迅速ことができ、それを呼び出しているどの方法によっては。