2012-02-08 78 views
1

我有一個從給定的列表返回一個比較矩陣的功能:從Python中的比較矩陣獲取數據

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] 

我以這種方式使用此功能:

>>> 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]] 

我需要一個函數返回給定矩陣的數據,如下面的代碼,但我不知道該怎麼做。

>>> 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

所以,你要使用的信息_all of_'d1..d5> d0'推斷D0 _must be_零?原始序列是否總是「0..5」的置換,還是還有其他一些你沒有提到的限制嗎? – Useless 2012-02-08 15:40:24

回答

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 2012-02-08 15:56:18

+0

@samvel:當然我認爲總排序定義的集合是0,...,n-1,正如我在我的回答中所述。這似乎是OP想要的。 – 2012-02-08 16:00:40