【发布时间】:2013-01-28 12:04:23
【问题描述】:
我正在维护一个字典,用于跟踪对象对之间的相似性。
例如,这本字典可能如下所示:
similarities = {
p1: {p2: v12, p3:v13, p4:v14},
p2: {p1: v21, p3:v23, p4:v24},
p3: {p1: v31, p2:v32, p4:v34},
p4: {p1: v41, p2:v42, p4:v43}
}
请注意,相似度测量是对称的。因此,similarities[p1][p2] 与similarities[p2][p1] 相同,即v12 == v21。
有时,我需要从similarities[p1] 中删除p2;在这样做的过程中,我还需要从similarities 的所有内部字典中删除p1 和p2。
这是乏味且低效的。
那么除了维护对称字典之外,有没有办法用复合键维护字典,以便我可以查找 similarities[p1,p2]?
由于(p1, p2) != (p2, p1),我不能真正使用tuple,而且我无法先验地知道如何订购元组。
frozenset 是我能想到的唯一其他容器,但这不会削减它,因为similarities 中可能仍有其他键包含p1 或p2 作为组件。那么我可以使用什么容器来解决这个问题呢?
技术信息:
- python 2.7
- 这个“复合键”中总是正好有 2 个元素
谢谢
【问题讨论】:
-
frozenset似乎可以解决您的问题 -- 有什么理由认为可能会有更好的解决方案吗? -
你能用
similarities[p1, p2]这样的语法吗? -
这里的frozenset有什么问题?
-
也许您对此感兴趣:stackoverflow.com/q/2572916/674039
-
“因为可能还有其他相似的键包含 p1 或 p2 作为组件” - 如果您的意思是您将同时拥有
frozenset({p1, p2})和frozenset({p1, p3}),我没有看看这是怎么回事。否则我想我不明白你的解释。
标签: python dictionary python-2.7 composite-key