Python 的方法类似于 Java 中的 'equals'
Python's method like 'equals' in Java
如何使 set
对象相等取决于我设置的自定义属性?就像 Java 的 equals
方法。
重点是我想要一个包含元组的集合(x,y)
。当我尝试将 (x,y)
元组放入集合中时,结果将取决于 x
.
set.add((x,y))
- OK
set.add((x,z))
- Can't add because there is already a touple which has x as a first value.
为什么不使用 dict
而不是 tuple
的 set
:
d = {}
d[x] = y
d[x] = z
虽然这会用 z
覆盖值 y
,但它确保您一次只有一个值。
如果您不希望覆盖成为可能,您可以继承 dict
以防止它:
class HalfFrozenDict(dict): # Name is a subject to change
def __setitem__(self, key, value):
if key in self:
raise KeyError("Key '{}' already exists!".format(key))
super().__setitem__(key, value)
def update(self, other):
other = {key: other[key] for key in other if key not in self}
super().update(other)
目前,如果您尝试重新设置项目,它会引发错误:
>>> d = HalfFrozenDict()
>>> d[0] = 1
>>> d[0] = 2
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
d[0] = 2
File "<pyshell#1>", line 5, in __setitem__
raise KeyError("Key: '{}' already exists!".format(key))
KeyError: "Key '0' already exists!"
此外,调用 d.update(other)
只会忽略 other
字典中的重复键。
这两种行为都可能发生变化:您愿意在 "invalid" update()
调用时引发错误吗?您是否愿意忽略项目的重新设置(我认为在这种情况下错误更好)?
如何使 set
对象相等取决于我设置的自定义属性?就像 Java 的 equals
方法。
重点是我想要一个包含元组的集合(x,y)
。当我尝试将 (x,y)
元组放入集合中时,结果将取决于 x
.
set.add((x,y))
- OK
set.add((x,z))
- Can't add because there is already a touple which has x as a first value.
为什么不使用 dict
而不是 tuple
的 set
:
d = {}
d[x] = y
d[x] = z
虽然这会用 z
覆盖值 y
,但它确保您一次只有一个值。
如果您不希望覆盖成为可能,您可以继承 dict
以防止它:
class HalfFrozenDict(dict): # Name is a subject to change
def __setitem__(self, key, value):
if key in self:
raise KeyError("Key '{}' already exists!".format(key))
super().__setitem__(key, value)
def update(self, other):
other = {key: other[key] for key in other if key not in self}
super().update(other)
目前,如果您尝试重新设置项目,它会引发错误:
>>> d = HalfFrozenDict()
>>> d[0] = 1
>>> d[0] = 2
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
d[0] = 2
File "<pyshell#1>", line 5, in __setitem__
raise KeyError("Key: '{}' already exists!".format(key))
KeyError: "Key '0' already exists!"
此外,调用 d.update(other)
只会忽略 other
字典中的重复键。
这两种行为都可能发生变化:您愿意在 "invalid" update()
调用时引发错误吗?您是否愿意忽略项目的重新设置(我认为在这种情况下错误更好)?