如果我们有(a1, b1)和(a2, b2),那么很容易使用字典来存储对应关系:
dict[a1] = b1
dict[a2] = b2我们可以把(a1, b1)和(a2, b2)找回来没问题。
但是,如果我们有(a1, b1, c1)和(a2, b2, c2),是否有可能得到这样的结果:
dict[a1] = (b1, c1)
dict[b1] = (a1, c1)在那里我们可以使用a1或b1来获取三元组(a1, b1, c2)?这有意义吗?我不太确定应该使用哪种数据类型来解决这个问题。上面的方法是可行的,但是会有重复的数据。
基本上,如果我有一个三元组,我可以使用哪种数据类型,以便我可以使用第一个或第二个值来获取三元组?
发布于 2019-04-29 01:07:57
解决方案
您可以编写自己的映射数据结构,允许add三元组或任何大小的组,并使用__getitem__恢复组。
class GroupMap:
def __init__(self):
self.data = {}
def add(self, group):
for item in group:
self.data[item] = group
def __getitem__(self, item):
return self.data[item]
group = (1, 2, 3)
group_map = GroupMap()
group_map.add(group)
print(group_map[1]) # (1, 2, 3)请注意,此GroupMap可用于任何大小的组,而不仅仅是三元组。
上面的下一步将是根据发生冲突时您想要的行为来扩展类以避免冲突。
理论
您可能想知道是否有更好的方法来表示连接的对象组。答案不是真的。
假设你有一个包含n个顶点的graph。然后,对于要连接的图,必须至少有n-1条边。在上面的数据结构中,我在dict中使用了n条目,这意味着解决方案几乎是最优的。
如果可以的话,为什么不使用n-1个条目呢?因为你需要遍历所有的图来恢复整个组。因此,多使用一条边可以进行O(1)查找,这可能是您想要进行的权衡。
发布于 2019-04-29 01:11:49
如果你想对dict进行子类化(获取所有其他与dict相关的方法,比如.get等),并且只在被请求时才获取其他元素(出于某种原因),那么也可以选择这个方法。你可以自己编一本新字典
class TupleDict(dict):
def __setitem__(self, key, value):
assert isinstance(key, tuple)
for i, e in enumerate(key):
dict.__setitem__(self, e, key[:i] + key[i+1:] + (value,))
dict.__setitem__(self, value, key)然后将任何属于元组的键分配给单个值(不确定我是否喜欢这种语法,但我们可以使其不同,或者使用独立的方法)
d = TriDict()
d[(1,2)] = 4你会得到__getitem__的结果,返回不存在的元组的其余部分。
>>> print(d[1])
(2, 4)
>>> print(d[2])
(1, 4)
print(d[4])
>>> (1, 2)发布于 2019-04-29 01:16:01
字典只能存储键值对。
你可以使用操作符重载来创建你自己的三元组字典,这样当你用三元组中的任何一个成员建立索引时,你就会得到另外两个成员,可能是这样的:
class trictionary:
def __init__(self):
self.data = []
def add(self, group):
self.data.append(group)
def __getitem__(self, key):
for group in data: #Find the set the key belongs to.
if key in group:
return tuple(group)这避免了复制数据,并具有您想要的功能,但以牺牲性能为代价。也许有一种更好的方法来做同样的事情。
https://stackoverflow.com/questions/55892600
复制相似问题