Как проверить, находится ли словарь в списке словарей как по ключу, так и по значению dict, где dicts могут быть вложенными? - PullRequest
0 голосов
/ 28 января 2019

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

Когда у меня много скаляров, которые я хочу проверить, существует ли каждый скаляр в целевом списке скаляров, я обычно делаю целевой список в набор и проверяюсуществование в наборе, вроде scalar in set(list_of_scalars).(Пожалуйста, дайте мне знать, если это уже не лучший способ сделать это)

Для диктов я не могу сделать my_dict in set(list_of_dicts), потому что это повышает unhashable type: 'dict'.

Выполнение my_dict in list_of_dicts, по-видимому, правильно возвращает False, если существует одно и то же имя ключа, но значение другое (что я и хочу), но меня беспокоит время выполнения;Python оптимизирует это внутренне?Что еще я могу делать?

РЕДАКТИРОВАТЬ: Предположим, что я буду выполнять МНОГО поиска и с использованием Python3.7

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Для оптимизации нескольких поисков вы можете создать класс хешируемого словаря и выполнить поиск по набору хешируемых словарей:

l = [{1:2,3:4}, {5:6,7:8}]
setofdicts = set(map(hashabledict, l))
hashabledict({5:6,7:8}) in setofdicts
#True
0 голосов
/ 28 января 2019

Чтобы проверить, существует ли скаляр в списке скаляров, я обычно делаю список в набор и проверяю существование в наборе, как скаляр в наборе (list_of_scalars).(Пожалуйста, дайте мне знать, если это уже не лучший способ сделать это)

Создание набора будет операцией O (n).Каждый последующий поиск в наборе будет иметь среднее значение за O (1), поэтому, если вы планируете выполнить много поисков, это того стоит.В противном случае, если вы выполните только один поиск, вам лучше выполнить линейный поиск в списке (при условии, что он не отсортирован).

Для dicts я не могу сделать my_dict в наборе (list_of_dicts), потому что это вызывает неприемлемый тип: 'dict'.Но my_dict в list_of_dicts работает нормально, но я беспокоюсь о времени выполнения;

Если вам нужно многократно выполнять этот поиск, то в зависимости от характера того, что вы храните в этих словарях, вы можете пересмотреть использование словарей и вместо этого выбрать объекты.Затем вы можете определить метод __hash__ для вашего объекта и сохранить их в виде набора, и поиск будет намного проще.

Python оптимизирует это внутренне?Что еще я могу делать?

Вы можете посмотреть на временную сложность операций со структурами данных Python здесь: TimeComplexity .У Python нет возможности оптимизировать общий поиск в общем списке, и он будет использовать поведение линейного поиска (O (n)).

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