2012-08-10 19 views
1

我有一個關於Python數組邏輯的問題,我不知道是否需要使用二維數組。 讓我說,我有一個從數據庫檢索到的數據,我想比較檢索到的每一行(例如我想比較row1和row2,然後row1和row3),我想我需要使用一個for循環有,這裏是所添加的條件:Python中的數組

if row1 == row2

我需要追加2個數組索引值(實施例ROW1 [1]和ROW1 [2])爲空數組(例如我聲明從開始的空陣列),其中每當一行匹配從數據庫檢索到的數據時,它將兩個值附加到該空字符串,直到它完成以比較檢索到的所有數據行。

而且,如果這兩個值已經存在於我用來追加兩個值的數組中,它將不會追加。

樣本:

emp_arr = [] #empty list 

#code here 

# if there are matches from the rows retrieved from database,the value of 
# emp_arr probably 
emp_arr = [[2,3], [5,9], [3,7], [2, 5]] 
# note:there should be no the same list index value inside(ex. emp_arr = [[2,3], 
# [5,9], [3,7], [2, 3]]---this should not happen so i need to a condition first 
# before making an append) 

在此先感謝球員。

+3

是否有任何特殊的理由這樣做,而不是作爲集合的字典或一組frozensets? – 2012-08-10 06:02:23

+0

讓我說我要使用附加值來更新數據庫中的某一列,例如: UPDATE --------- WHERE(column1,column2)IN(emp_arr) – obutsu 2012-08-10 06:15:58

+0

有些問題:你想要顛倒數組索引對(例如[1,2]和[2,1]),還是僅僅其中之一?如果有三個或更多個相等的值,是否需要它們之間的所有對(例如,如果行[1] ==行[2] ==行[3],是否需要[1,2],[1,3 ]和[2,3])還是對重複索引的限制意味着每個索引最多隻能出現一次,無論它是如何配對的? – Blckknght 2012-08-10 07:22:14

回答

1

看來你想要做的是這樣的僞SQL:

SELECT DISTINCT left_tbl.some_column, left_tbl.another_column 
FROM table_name left_tbl, table_name right_tbl 
WHERE left_tbl.* = right_tbl.* 
    AND left_tbl.id != right_tbl.id 
    -- where * is everything except id column 

在Python(已檢索所有行是rows迭代):

from itertools import combinations 

result = set((row1[1], row1[2]) 
      for row1, row2 in combinations(rows, 2) 
      if row1 == row2) 
1

它不清楚如果您要求匹配行的值或者是否需要這些行的索引。我假設你想要索引,這意味着我的答案與J.F.塞巴斯蒂安的答案明顯不同,如果你想要這些值,這可能是最好的。

如果你確實需要索引,目前還不清楚你想如何處理多個匹配。如果行[1] ==行[2] ==行[3],您可以將[1,2],[1,3]和[2,3]作爲匹配索引,或者您可能只需要其中的一個。我假設你只想要其中的一個,而且它並不特別關心哪個(下面的兩個函數總是提供[1,2]而不是其他的,儘管如果需要的話它們可以被修改以偏好不同的一對)。

這裏有一個類似的方法,明確遍歷索引,跳過任何已經被匹配:

def findMatchedRowPairsWithoutDuplicates(rows): 
    matched = set() 
    result = [] 
    for i in range(len(rows)): 
     if i in matched: 
      continue 
     for j in range(i+1, len(rows)): 
      if j in matched: 
       continue 
      if row[i] == row[j]: 
       result.append([i,j]) 
       matched.add(i) 
       matched.add(j) 
       break # can't match with the current i again! 
    return result 

下面是立下戰功排序,以有可能找到重複的速度(時間複雜度爲O(N日誌替代實現(N))而不是O(N )),但它要求您的行值具有部分排序(即必須定義row1 < row2)。這對大多數數據庫值來說可能是正確的,但可能並不總是由給定的庫實現來保證。理解這段代碼的關鍵是,在排序後,相等行的索引將始終在列表中相鄰,因此我們只需要檢查每個相鄰索引對而不是所有對。

findMatchedRowPairsWithoutDuplicates2(rows): 
    indexes = list(range(len(rows))) 

    indexes.sort(key=lambda index: rows[index]) 

    results = [] 
    i = 0 
    while i < len(indexes)-1: 
     if rows[indexes[i]] == rows[indexes[i+1]]: 
      results.append(indexes[i], [indexes[i+1]) 
      i += 2 
     else: 
      i += 1 
    return results 
+0

OP是不清楚的,所以我不會downvote,但你的第一段是錯誤的(我沒有進一步閱讀)。如果'row [1] == row [2] == row [3]';在結果中只有一對'(行[1] [1],行[1] [2])''。 – jfs 2012-08-10 11:51:44

+0

哦,我明白了。那麼我們對這個問題的解釋還有另一個區別。您正在製作匹配行中的值列表,而我正在返回索引。你是對的,你的設置將避免重複,因爲這些值對所有匹配的對是通用的。我會編輯我的帖子,使我的假設(這可能不正確)更明顯。 – Blckknght 2012-08-10 18:13:30

+0

OP的註釋「UPDATE --------- WHERE(column1,column2)IN(emp_arr)」表明'emp_arr'應該累加值,而不是索引。 – jfs 2012-08-10 20:23:49