Удалить элемент из списка Python по идентичности, а не равенству - PullRequest
1 голос
/ 08 ноября 2019

Я определяю объект Python и хочу, чтобы у него был метод, который я могу вызывать для перемещения его между различными списками, в которых он может появиться. Я написал следующую реализацию:

def transfer(self, source, destination):
   source.remove(self)
   destination.append(self)

Однако,Вскоре я обнаружил, что реализация Python list.remove работает на основе равенства, а не идентичности;то есть, если в source ранее есть другой элемент, который оценивается как self, этот элемент удаляется вместо него.

Как я могу реализовать это, чтобы получить намерение, которое я намереваюсь - что толькоточный элемент, на который ссылаются, удаляется из source, а не любого старого элемента, который равен ему по значению? Или, более вероятно, каков альтернативный подход к реализации моего transfer метода?

1 Ответ

1 голос
/ 08 ноября 2019

Вы можете использовать оператор is для операции, он проверяет идентичность, что объект является тем же объектом, а не эквилийтом:

Код может выглядеть следующим образом:

def transfer(self, source, destination):
    for i in range(len(source)):   # check all elements of the list
        # check if element is self ("is" checks not equality but identity)
        # "==" checks identity
        if source[i] is self:  
            element = source.pop(i)  # remove element by index to be sure that it is what we need
            break
    destination.append(element)

Некоторые тесты:

def transfer(x, source, destination):
    for i in range(len(source)):   # check all elements of the list
        # check if element is self ("is" checks not equality but identity)
        # "==" checks identity
        print(source[i])  # will print 4 times to prove that 4th element was taken
        if source[i] is x:

            element = source.pop(i)  # remove element by index to be sure that it is what we need
            break
    destination.append(element)


class Test:
    def __init__(self, x):
        self.x = x

    def __eq__(self, other):
        if self.x == other.x:
            return True
        return False

    def __repr__(self):
        return "Test({})".format(self.x)

x, y, z, a = Test(1), Test(2), Test(3), Test(3)

list_1 = [x, y, z, a]
list_2 = []

transfer(a, list_1, list_2)
print(list_1)
print(list_2)

Дайте мне знать, если это помогло, не стесняйтесь задавать вопросы.

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