0

我正在尝试减少 SQL Server 数据库表中的重复项,并且条件很复杂。所有表数据都被拉入 Pythonlist中。

在这一步中,当一个值与行中重复的值list匹配时,我想使用列表推导来查找某个字段值。listlist

listA 是dupIDs 的唯一列表:[134L, 1610L, 1861L, 2026L, 3211L, 4134L, 4363L, 4453L, 4733L,...]

listB 是二维的:

  Row#    dupID    nameID   SSN           personID

[[85097L, 236479L, 241583, '999-99-0000', 359913, datetime.datetime(2012, 9, 9, 0, 0)]

 [78654L, 236479L, 996783, '999-99-0000', NULL,   datetime.datetime(2008, 5, 4, 0, 0)]...]

这些是我想通过列表理解加速的循环:

personIDList = []
for i in range(len(A)):
        for j in range(len(B)):
             if A[i] == B[j][1]: # if dupID == dupID
                   personIDList.append(B[j][4]) # append personID
4

4 回答 4

3

首先将唯一 ID 列表转换为集合:

s = set(A)

然后使用列表推导遍历另一个列表:

personIDList = [item[4] for item in B if item[1] in s]

O(N)与您的方法相比,这将是复杂的O(N**2)

于 2013-10-10T16:30:57.107 回答
1

首先,你会遍历元素而不是索引,所以你会得到这个:

personIDList = []
for a in A:
    for b in B:
        if a == b[1]:
            personIDList.append(b[4])

这可以很容易地变成一个列表理解:

personIDList = [b[4] for a in A for b in B if a == b[1]]
于 2013-10-10T16:25:59.943 回答
0

以下是将单个 for 循环转换为列表理解的方法:

my_list = []
for i in something:
    my_list.append(i+7)

my_list = [i+7 for i in something]

以下是将嵌套的 for 循环转换为列表理解的方法:

my_list = []
for i in first_thing:
    for j in second_thing:
        my_list.append(i + j)

my_list = [i + j for i in first_thing for j in second_thing]

所以在你的情况下,你想这样做:

personIDList = [b[4] for a in A for b in B if a == b[1]]
于 2013-10-10T16:31:13.023 回答
0
import numpy as np
A = np.array(A)
B = np.array(B)
person_ids = B[np.in1d(list(B[:,1]),A)][:,4]

我认为至少...如果您发布示例 A 和 B 列表会更容易

我总是喜欢做 numpy 的东西:P

我们可以通过将其拆分来使其更具可读性

dup_ids_in_b = list(B[:,1]) # take column 1 from B (we use list so its not of type `object`)
boolmask_b_dups_in_a = np.in1d(dup_ids_in_b,A) # True,True,False,... True for all indices where B[i][1] is in A
person_ids = B[boolmask_b_dups_in_a][:,4] # take the fourth column of all the True indices from last step
于 2013-10-10T16:34:49.177 回答