Сравнение полей у объектов

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

for i in range(len(boxes) - 1):
    if boxes[i].x == boxes[i + 1].x and boxes[i].y == boxes[i + 1].y and direction == "right":
        boxes[i + 1].move(-self.player.speed, 0)
        player.move("left")
    elif boxes[i].x == boxes[i + 1].x and boxes[i].y == boxes[i + 1].y and direction == "left":
        boxes[i + 1].move(+self.player.speed, 0)
        player.move("right")

Код срабатывает, но не на все элементы, как сделать чтоб срабатывало на все элементы списка?


Ответы (1 шт):

Автор решения: Zhihar

А если в лоб попробовать:

boxes = [
    {
        'key1': 12,
        'key2': 20,
    },
    {
        'key2': 30,
        'key3': 'test',
    },
    {
        'key3': 'test'
    }
]


# функция проверки на совпадение значений
def check(boxes):
    # проверить все элементы списка
    for i in range(len(boxes)):
        # проверить текущий элемент со всеми последующими элементами списка
        for j in range(i + 1, len(boxes)):
            # получить список одинаковых ключей
            keys_common = boxes[i].keys() & boxes[j].keys()

            # проверить значения одинаковых ключей
            for key in keys_common:
                if boxes[i][key] == boxes[j][key]:
                    return True

    return False


print("YES" if check(boxes) else "NO")

данная функция простых типов - числа, строки, булевы типы и т.п.

для сложных типов (итерируемые и т.п.) надо функцию сделать рекурсивной

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

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

→ Ссылка