Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/76: Рейтинг темы: голосов - 76, средняя оценка - 4.76
0 / 0 / 0
Регистрация: 20.12.2019
Сообщений: 2

С занесением во множества и словари

08.01.2020, 21:10. Показов 16173. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
озьмём класс Point из задачи «Равенство и порядок» (в классе должна быть определена проверка на равенство) и попробуем положить несколько точек этого класса во множество или сделать их ключами словаря. Получим ошибку:

>>> points_set = {Point(’A’, 0, 3), Point(’A’, 0, 3)}
Traceback (most recent call last):
Python Shell, prompt 2, line 1
builtins.TypeError: unhashable type: ’Point’
Кстати, если закомментировать метод __eq__, ошибка исчезнет, но во множество добавятся одинаковые на наш взгляд точки.

Дело в том, что проверка на равенство может быть достаточно затратной операцией и, чтобы минимизировать количество сравнений, используется технология хеширования. Наличие свойства hashable у объекта означает, что для него определено специальное неизменное значение (в случае множеств и словарей это целое число), с помощью которого он предварительно быстро сравнивается с другими объектами. Если хеши двух объектов равны, объекты могут быть равны в смысле __eq__ (а могут и не быть), но если хеши различаются, объекты точно различны.

По умолчанию у пользовательских объектов есть хеши, которые строятся на основе их id() и, соответственно, различны для всех объектов. Когда же мы создаём свою реализацию __eq__, такой хеш перестаёт быть актуальным, потому что допускает существование равных (с нашей точки зрения) объектов с различными хешами, что противоречит самой идее хеширования.

Таким образом, чтобы восстановить хеширование, нам надо самим определить метод __hash__. Это несложно сделать, если, следуя рекомендациям из документации, вычислять хеши с помощью функции hash() на основе тех же полей объекта, которые участвуют в сравнении __eq__.

Соответственно, ваша задача — определить метод __hash__ для класса Point.
Формат ввода
Каждый тест представляет собой код, в котором будет использоваться ваш класс.
Пример 1
Ввод
Вывод
from solution import Point

points_set = {Point("A", 0, 3), Point("A", 0, 3),
Point("A", 3, 0), Point("B", 0, 3)}
print(sorted(points_set))
[Point('A', 0, 3), Point('A', 3, 0), Point('B', 0, 3)]
Пример 2
Ввод
Вывод
from solution import Point

points = [Point("A", 0, 3), Point("A", 0, 3),
Point("A", 3, 0), Point("A", 3, 0),
Point("B", 0, 3), Point("A", 0, 3)]
points_dir = {}
for i, point in enumerate(points):
points_dir[point] = i
print(["{}: {}".format(k, v) for k, v in sorted(points_dir.items())])
['A(0, 3): 5', 'A(3, 0): 3', 'B(0, 3): 4']
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.01.2020, 21:10
Ответы с готовыми решениями:

Множества, словари
Спортлото: 5 из 36. Составьте программу, в которой загадываются, иначе говоря, создаются 5 разных чисел, значения которых никак не...

Множества, словари
Введите множество, состоящее из 20 целых чисел от 1 до 50. Определите, сколько чисел, у которых последняя цифра 3, 5 или 7.

Словари и множества
Дана не пустая последовательность слов из строчных латинских букв; между соседними словами – запятая, за последним словом – точка. ...

1
11 / 11 / 1
Регистрация: 16.01.2020
Сообщений: 19
22.12.2020, 11:07
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
class Point:
    def __init__(self, name, x, y):
        self.name = name
        self.x = x
        self.y = y
 
    def get_x(self):
        return int(self.x)
 
    def get_y(self):
        return int(self.y)
 
    def get_coords(self):
        return '({}, {})'.format(self.x, self.y)
 
    def __eq__(self, other):
        if not isinstance(other, Point):
            return False
        if self.name == other.name and self.x == other.x and self.y == other.y:
            return True
        return False
 
    def __gt__(self, other):
        if self.name > other.name:
            return True
        elif self.x > other.x and self.name == other.name:
            return True
        elif self.y > other.y and self.x == other.x and self.name == other.name:
            return True
        else:
            return False
 
    def __lt__(self, other):
        if self.name < other.name:
            return True
        elif self.x < other.x and self.name == other.name:
            return True
        elif self.y < other.y and self.x == other.x and self.name == other.name:
            return True
        else:
            return False
 
    def __ge__(self, other):
        if self.name > other.name:
            return True
        elif self.x > other.x and self.name == other.name:
            return True
        elif self.y >= other.y and self.name == other.name and self.x == other.x:
            return True
        else:
            return False
 
    def __le__(self, other):
        if self.name < other.name:
            return True
        elif self.x < other.x and self.name == other.name:
            return True
        elif self.y <= other.y and self.x == other.x and self.name == other.name:
            return True
        else:
            return False
 
    def __hash__(self):
        return hash(self.name)
 
    def __str__(self):
        return '{}({}, {})'.format(self.name, self.x, self.y)
 
    def __repr__(self):
        return "Point('{}', {}, {})".format(self.name, self.x, self.y)
 
    def __invert__(self):
        return Point(self.name, self.y, self.x)
3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.12.2020, 11:07
Помогаю со студенческими работами здесь

Множества, словари, функции
Напишите функцию sum_range(start, end), которая суммирует все целые числа от значения «start» до величины «end» включительно. Если...

Задача на словари и множества
К коду ниже необходимо добавить &quot;возможность вывода из словаря (без его преобразования в список) Списка студентов (а также информацию о...

Множества, Кортежи, Словари
Напечатайте все целые числа в диапазоне от 1 до 1600, которые представимы в виде x*x+y*y, но которые нельзя представить в виде x*y=c*c...

Словари и множества. SET MAP
Помогите с задачей Пишите задачу в тело сообщения!

Списки,Котежи,Словари, Множества!
Проблема в том ,то что всё знать невозможно..вроде разобрался со списками и котрежами,начал вникать в словари и множества,забыл списки и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru