我需要在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中实现呢?示例代码将非常有用
答案 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]