Как указать пользовательский компаратор для ключевого слова «in» в Python? - PullRequest
4 голосов
/ 28 марта 2012

Я довольно новичок в Python, поэтому приветствую альтернативные подходы.

У меня есть список словарей, с которых я начинаю (чтение из файла).Теперь у меня есть несколько дополнительных словарей, которые я хотел бы добавить в этот список, но только если их нет в исходном списке.

Однако мне требуется, чтобы «не в исходном списке» определялась пользовательская функция сравнения, а не то, что Python использует по умолчанию.

Более конкретно, я хочу сравнить определенный ключ /пары значений в словаре и, если они совпадают, возвращают «true» для выражения.

myList = ReadFromFile...
newList = ReadFromFile...
for item in newList:
    if item not in myList: #I want custom behavior for this "in"
        myList.append(item)

Ответы [ 4 ]

9 голосов
/ 28 марта 2012

Использование any:

any(customEquals(item, li) for li in myList)

Если myClass относится к типу, которым вы можете управлять, вы также можете перезаписать метод __contains__.

2 голосов
/ 28 марта 2012

Ты не.Оператор in является частью синтаксиса языка.То, что вы хотите сделать, это что-то вроде этого:

def comparison(item, otherContainer):
  # Code here for custom comparison.
  return True or False

for item in NewList:
  if not comparison(item, myList):
    myList.append(item)
1 голос
/ 28 марта 2012

Если вам нужна функция типа (object, object) --> bool, которая проверяет наличие содержимого, в стандартной библиотеке lib уже есть одна:

from operator import contains

myList = ReadFromFile...
newList = ReadFromFile...
for item in newList:
    if not contains(myList, item):
        myList.append(item)
1 голос
/ 28 марта 2012

Чтобы ответить на ваш комментарий к ответу gddc:

Если ваши значения могут быть хэшируемыми (грубо говоря, это означает, что они неизменяемы), возможно, наиболее эффективным является использование наборов Python.После прочтения в myList создайте набор интересующих значений из myList.(Если я правильно читаю ваш вопрос, у вас будет набор кортежей, сгенерированный из myList.) Затем, когда вы зацикливаетесь на newList, вы можете проверить членство (опять же, интересующих вас значений) по этому набору, что составляет O (1) на тест, что приводит к алгоритмической сложности O (m + n).

Вы можете использовать operator.itemgetter, чтобы получить значения, представляющие интерес.

...