1

Python 配列のロジックに問題があります。2D 配列を使用する必要があるかどうかわかりません。たとえば、データベースから取得したデータがあり、取得した各行を比較したいとします(たとえば、row1 と row2 を比較してから、row1 と row3 を比較したい)、そこで for ループを使用する必要があると思います。追加された条件は次のとおりです。

if row1 == row2:

2 つの配列インデックス値 (例: row1 [1] と row1[2]) を空の配列(例: 最初から空の配列を宣言した) に追加する必要があります。データベースは、取得したすべてのデータ行の比較が完了するまで、2 つの値をその空の文字列に追加します。

念のため、2 つの値を追加していた配列にその 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)

よろしくお願いします。

4

2 に答える 2

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)
于 2012-08-10T06:47:42.210 に答える
1

一致する行から値を求めているのか、それらの行のインデックスが必要なのかは明らかではありません。つまり、私の答えは JF Sebastian のものとは著しく異なります。値が必要な場合は、おそらくこれが最適です。

インデックスが必要な場合、複数の一致をどのように処理するかは明確ではありません。行[1] == 行[2] == 行[3] の場合、一致するインデックスとして [1,2]、[1,3]、および [2,3] を取得できます。または、それらの 1 つだけが必要な場合もあります。そのうちの 1 つだけが必要であり、どちらが特に問題ではないことを前提としています (以下の両方の関数は常に [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 2 )ではなく O(N log(N)) です) 。row1 < row2定義されています)。これはおそらくほとんどの種類のデータベース値に当てはまりますが、特定のライブラリの実装によって常に保証されるとは限りません。このコードを理解するための鍵は、indexesリストが並べ替えられた後、等しい行のインデックスは常にリスト内で隣接するため、すべてのペアではなく、隣接する各インデックス ペアのみをチェックする必要があるということです。

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
于 2012-08-10T08:14:28.827 に答える