存储关系和重量时要使用什么数据结构?

时间:2018-01-29 00:09:13

标签: python data-structures

我需要在Python中表示关系,我正在寻找关于我可以使用什么以及如何使用的建议。

关系表示为:

[(item1, relation) -> item2] -> weight

它表示当item1和item2给出它们之间的关系时,这个元组的权重为1.例如[(cars, has parts) -> wheels] -> 1

对于那些熟悉C ++的人,要知道我们可以使用类似

的东西
map<pair<int,int>, map<int,int> > ok;

我可以使用{item1, {item2, {relation, weight}}}之类的嵌套词典。但这对于任何将来会遇到它的人来说都是非常丑陋的,也会让人感到困惑。

那么如何以更清洁的方式在Python中实现呢?示例代码将非常有用

4 个答案:

答案 0 :(得分:1)

您可以使用对象和类来表示复杂的数据结构,然后使用Arrays将其作为集合。

这是我在Python 3.6中编写和测试的一个例子

>>> class WeightedRelationship:
...     def __init__(self, item1, item2, relationship, weight):
...             self.item1 = item1
...             self.item2 = item2
...             self.relationship = relationship
...             self.weight = weight

使用您的汽车/车轮关系示例,您可以创建此类的实例:

>>> cars = WeightedRelationship(item1 = "Car", item2 = "Wheel", relationship = "has parts", weight = 1)

然后您可以使用数组来存储多个实例。

答案 1 :(得分:1)

你可以使用简单的python字典(比如json对象):

{{1}}

答案 2 :(得分:1)

我不确定您需要什么,但您可以将匿名函数存储为词典中的键或值。为简单起见,我选择了一个数字示例。

d = [(1, lambda x, y: x+y==4, 3),(1, lambda x, y: x+y==5, 7)]
d2 = {k: k[1](k[0], k[2]) for k in d}

# d2
# {(1, <function __main__.<lambda>>, 3): True,
#  (1, <function __main__.<lambda>>, 7): False}

lambda函数可以执行任何操作,例如如果你有一个字典映射汽车到所有部分的列表,那么你可以定义lambda x, y: y in car_parts_dict[x]或类似的东西。

答案 3 :(得分:1)

除了人们给出的其他答案之外,你还提到了这个C ++代码:

map<pair<int,int>, map<int,int> > ok;

如果ok是一个字典,其中键是包含2个int s的元组,其中值也是包含2个int s的元组,那么你可以在Python中做同样的事情,例如:

ok = {(item1,relation):(item2,weight)}

但是,我同意其他答案,嵌套词典是最干净​​的方法:

ok = {item1:{relation:{item2:weight}}}

因此您可以通过以下方式访问权重:

ok[item1][relation][item2]