SQLite сравнить запрос Python - PullRequest
1 голос
/ 09 октября 2011

Я пытался найти лучший способ написать запрос для сравнения строк в двух таблицах.Моя цель - увидеть, находятся ли два кортежа в наборе результатов A в большем наборе результатов B. Я хочу видеть только кортежи, которые отличаются в результатах запроса.

'''SELECT table1.field_b, table1.field_c, table1.field_d
'''FROM table1
'''ORDER BY field_b

results_a = [(101010101, 111111111, 999999999), (121212121, 222222222, 999999999)]

'''SELECT table2.field_a, table2.fieldb, table3.field3
'''FROM table2
'''ORDER BY field_a

results_b =[(101010101, 111111111, 999999999), (121212121, 333333333, 999999999),    (303030303, 444444444, 999999999)]

Так что я хочусделать это взять results_a и убедиться, что у них есть точное совпадение где-то в results_b.Так как вторая запись во втором кортеже отличается от записи в results_a, я хотел бы вернуть второй кортеж в results_a.

В конечном итоге я хотел бы вернуть набор, который также имеет второй кортеж, который сделалне совпадают в другом наборе, чтобы я мог ссылаться на оба в моей программе.В идеале, поскольку второй первичный ключ кортежей (field_b в таблице 1) не соответствует соответствующему первичному ключу (field_a) в таблице 2, я хотел бы отобразить results_c = {(121212121, 222222222, 999999999) :( 121212121, 222222222, 999999999)},Это усложняется тем фактом, что результаты в обеих таблицах не будут в одинаковом порядке, поэтому я не могу написать код, который говорит (сравните tuple2 в results_a с tuple2 в results_b).Это больше похоже на сравнение (сравните tuple2 в results_a и посмотрите, соответствует ли оно какой-либо записи в results_b. Если первичные ключи совпадают, и ни один из кортежей в результатах b не полностью совпадает или частичное совпадение не найдено, возвращаются записи, которые не совпадают.)

Я прошу прощения, что это так многословно.Я не мог придумать лучшего способа объяснить это.Любая помощь будет высоко ценится.

Спасибо!

ОБНОВЛЕНИЕ УСИЛИЯ НА ЧАСТИЧНЫЕ МАТЧИ

a = [(1, 2, 3),(4,5,7)]
b = [(1, 2, 3),(4,5,6)]
pmatch = dict([])

def partial_match(x,y):
    return sum(ea == eb for (ea,eb) in zip(x,y))>=2

for el_a in a:
    pmatch[el_a] = [el_b for el_b in b if partial_match(el_a,el_b)]
print(pmatch)

ВЫХОД = {(4, 5, 7): [(4,5, 6)], (1, 2, 3): [(1, 2, 3)]}.Я ожидал бы, что это будет просто {(4,5,7) :( 4,5,6)}, потому что это единственные наборы, которые отличаются.Есть идеи?

1 Ответ

1 голос
/ 09 октября 2011

Возьмите results_a и убедитесь, что они точно совпадают где-то в results_b:

for el in results_a:
  if el in results_b:
     ...

Получить частичные совпадения:

pmatch = dict([])
def partial_match(a,b):
  # for instance ...
  return sum(ea == eb for (ea,eb) in zip(a,b)) >= 2
for el_a in results_a:
  pmatch[el_a] = [el_b for el_b in results_b if partial_macth(el_a,el_b)]

Вернуть записи, которые не совпадают:

no_match = [el for el in results_a if el not in results_b]

- РЕДАКТИРОВАТЬ / Другое возможное частичное совпадение

def partial_match(x,y):
  nb_matches = sum(ea == eb for (ea,eb) in zip(x,y))
  return 0.6 < float(nb_matches) / len(x) < 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...