2012-02-08 8 views
1

私は与えられたリストから比較行列を返す関数があります。取得データ

>>> matrix([0, 4, 5, 2, 1, 3]) 
[[0, 1, 1, 1, 1, 1], 
[-1, 0, 1, -1, -1, -1], 
[-1, -1, 0, -1, -1, -1], 
[-1, 1, 1, 0, -1, 1], 
[-1, 1, 1, 1, 0, 1], 
[-1, 1, 1, -1, -1, 0]] 

私は必要があります:私はこの方法でこの機能を使用する

def compare(a, b): 
    if b > a: 
     return 1 
    elif b < a: 
     return -1 
    else: 
     return 0 

def matrix(data): 
    return [[compare(a, b) for b in data] for a in data] 

を以下のコードのように、与えられた行列からデータを返す関数ですが、どうやって行うのか分かりません。

>>> data_from_matrix([[0, 1, 1, 1, 1, 1], 
         [-1, 0, 1, -1, -1, -1], 
         [-1, -1, 0, -1, -1, -1], 
         [-1, 1, 1, 0, -1, 1], 
         [-1, 1, 1, 1, 0, 1], 
         [-1, 1, 1, -1, -1, 0]]) 
[0, 4, 5, 2, 1, 3] 
+0

だからあなたがゼロbe_そのD0の_mustを推測するために 'd1..d5> d0' OF_ _allその情報を使用したいですか?元のシーケンスは常に「0..5」の置換であるか、言及していない他の制約がありますか? – Useless

答えて

3

単純ハックは、行列のすべての行にわたって和を計算することであろう。

def data_from_matrix(m): 
    return [(len(m) - 1 - sum(row)) // 2 for row in m] 

これは行列が実際に全順序を定義し、一貫性をチェックしないことを前提としてい行列の別の前提は、合計発注が定義されると想定されるセットがrange(len(m))であるということです。

例:

>>> data_from_matrix([[ 0, 1, 1, 1, 1, 1], 
...     [-1, 0, 1, -1, -1, -1], 
...     [-1, -1, 0, -1, -1, -1], 
...     [-1, 1, 1, 0, -1, 1], 
...     [-1, 1, 1, 1, 0, 1], 
...     [-1, 1, 1, -1, -1, 0]]) 
[0, 4, 5, 2, 1, 3] 
+0

素敵なトリックです。ただし、この特定のマトリックスについてのみ動作します:[0,4,5,2,1,3]、b/c比較マトリックスは元のベクトルを復元するのに十分な情報を持っていません。 – Samvel

+0

@samvel:もちろん、私は私の答えに述べたように、合計注文が定義されているセットは0、...、n-1であると仮定しました。これはOPが望んでいるようです。 –