Сравнение полей у объектов
Есть список обьектов, нужно перебирать его, и, если у двух любых обьектов, в этом списке, есть одинаковые поля - выполнять какие-то действия. Пробовал что-то вот такое:
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")
данная функция простых типов - числа, строки, булевы типы и т.п.
для сложных типов (итерируемые и т.п.) надо функцию сделать рекурсивной
т.е. если выбранные значения - это итерируемый объект - пройти по всем его элементам и вызвать саму себя,
если выбранные значения - словари, то пройти по всем ключам словаря и вызывать саму себя