2013-10-10 6 views
0

Я пытаюсь уменьшить дубликаты в таблице базы данных SQL Server, и критерии сложны. Все данные таблицы были перенесены в Python list s.Python List Comprehension для данных базы данных

На этом этапе я хочу использовать список понимание, чтобы найти определенное значение поля, когда один list значения соответствует значению list, который имеет дубликаты строк list.

list А представляет собой уникальный список dupID с: [134L, 1610L, 1861L, 2026L, 3211L, 4134L, 4363L, 4453L, 4733L,...]

list B является двумерным:

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 
+0

«Я хочу ускорить понимание списка»? Что заставляет вас думать, что понимание списка будет быстрее? – Johnsyweb

ответ

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]] 
3

Преобразовать уникальный список идентификаторов для набора первого:

s = set(A) 

Тогда итерации по другому списку с помощью в перечне:

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

Это будет O(N) по сложности по сравнению с вашим подходом, который составляет O(N**2).

+3

+1 Хорошая идея использовать набор здесь! – poke

0

Вот как вы поворачиваете один цикл в списке понимание:

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

идет в

my_list = [i+7 for i in something] 

Вот как вы поворачиваете вложенными для петель в списке понимание:

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

Я думаю, по крайней мере ... это было бы проще, если вы вывесили пример А и В список

Я всегда как делать 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 
+0

Большое спасибо за помощь! Я опубликую, что я делаю. – Albert