1

我对 Python 数组的逻辑有疑问,我不知道是否需要使用 2D 数组。比方说,我有一个从数据库中检索到的数据,我想比较检索到的每一行(例如,我想比较 row1 和 row2,然后比较 row1 和 row3),我想我需要在那里使用 for 循环这是附加条件:

if row1 == row2

我需要将两个数组索引值(例如 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)

提前谢谢各位。

4

2 回答 2

1

不清楚您是要从匹配的行中获取值还是要这些行的索引。我假设您想要索引,这意味着我的答案与 JF Sebastian 的答案明显不同,如果您想要这些值,这可能是最好的。

如果您确实需要索引,则不清楚您要如何处理多个匹配项。如果 row[1] == row[2] == row[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 log(N)) 而不是 O(N 2 )),但它要求您的行值具有部分排序(即,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 回答
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 回答