Найти разницу между списком и множеством - PullRequest
1 голос
/ 01 июля 2019

Я пытаюсь найти различия между записями MongoDB. После выполнения моих запросов я получаю набор уникальных результатов (применяя set()).

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

Что я сделал сейчас, так это:

unique_documents = set([str(i) for i in dict_of_uniques[my_key]])
all_documents = [str(i) for i in (dict_of_all_docs[my_key])]

По сути, я пытаюсь сравнить строковую версию dict между двумя переменными.

У меня есть несколько подходов, среди которых unique_documents.difference(all_documents), но он не возвращает пустой набор. Я точно знаю, что переменная all_documents содержит две новые записи в записи. Я хотел бы знать, кто они.

Спасибо,

Ответы [ 3 ]

1 голос
/ 01 июля 2019

Если all_documents - это набор с новыми элементами, которые вы хотите получить в результате, вам необходимо изменить порядок аргументов в методе difference.

unique_documents = set([str(i) for i in dict_of_uniques[my_key]])
all_documents = set([str(i) for i in (dict_of_all_docs[my_key])])
all_documents.difference(unique_documents)

Посмотрите, как важен порядок:

>>> x = set([1,2,3])
>>> y = set([3,4,5])
>>> x.difference(y)
{1, 2}
>>> y.difference(x)
{4, 5}

difference дает вам элементы набора first , которых нет в наборе second .

Если вы хотите увидеть, что было добавлено или удалено, вы можете symmetric_difference.Эта функция описывается как «симметричная», поскольку она дает одинаковые результаты независимо от порядка аргументов.

>>> x.symmetric_difference(y)
{1, 2, 4, 5}
>>> y.symmetric_difference(x)
{1, 2, 4, 5}
0 голосов
/ 01 июля 2019

Вместо unique_documents.difference(all_documents) используйте all_documents.difference(unique_documents)

Подробнее о наборах Python

0 голосов
/ 01 июля 2019

Трудно сказать без описания структуры словаря, но ваш код, похоже, сравнивает только отдельные ключи. Если вы хотите сравнить содержимое обоих словарей, вам нужно получить все значения:

currentData = set( str(rec) for rec in dict_of_all_docs.values() )
changedKeys = [k for k,value in dict_of_fetched.items() if str(value) not in currentData]

Это не кажется очень эффективным, но без дополнительной информации о структуре данных трудно сделать лучшее предложение. Если ваши записи уже сопоставлены по словарному ключу, вам, вероятно, вообще не нужно использовать набор. Простой цикл должен сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...