0

SQL Server データベース テーブルの重複を削減しようとしていますが、基準が複雑です。すべてのテーブル データは Python に取り込まれていますlist

このステップでは、リスト内包表記を使用して、1 つの値が行に重複があるの値とlist一致する場合に、特定のフィールド値を見つけたいと考えています。listlist

listA はdupIDs の一意のリストです。[134L, 1610L, 1861L, 2026L, 3211L, 4134L, 4363L, 4453L, 4733L,...]

listB は 2 次元です。

  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
import numpy as np
A = np.array(A)
B = np.array(B)
person_ids = B[np.in1d(list(B[:,1]),A)][:,4]

少なくとも... AとBのリストの例を投稿すると簡単になると思います

私はいつも派手なことをするのが好きです: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 に答える
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 に答える