我正在寻找一种将给定值映射到数据 struct 中的键的元组的方法,以便datastructure[key1, key2]
返回与datastructure[key2, key1]
相同的值,而不必为键元组的每个Mutations 保存两次值.理想情况下,我正在寻找一种带有集合或"不区分顺序的元组"(我知道,根据定义元组是有序的)作为键的字典.
我的用例是:我需要以一种有效的方式保存字符串对的相似性值.因为sim(word1, word2)
等于sim(word2, word1)
(所以排序并不重要),所以我不想保存每个元组的值,因为这是多余的.相反,我希望 for each 单词对(元组键)保存一个值,并通过组成该对的单词的任一顺序来访问它.
目前,我正在这样做,它运行得很好:
d = {tuple(sorted(['w1', 'w2'])): 4}
print(d[tuple(sorted(['w1', 'w2']))])
print(d[tuple(sorted(['w2', 'w1']))])
>> 4
>> 4
但现在,每次更新和访问字典都需要列表初始化、排序操作和元组转换.
有没有一种很好的方法来做我想做的事情,而不需要使用上面的变通方法或定义一个定制的类作为键?也许有一种数据 struct 完全允许这样做,甚至可能更快,因为它是在比我的解决方案更低的级别上实现的. 理想情况下,如下所示:
d = {('w1', 'w2'): 4}
print(d[('w1','w2')])
print(d[('w2','w1')])
>> 4
>> 4
注:上面的例子不起作用,因为('a2','b2') != ('b2','a2')
.
以下是我到目前为止所做的研究,并解释了为什么这些解决方案不完全是我想要的:
- 定义一个定制类,其中MyObject(‘a2’,‘b2’)等于MyObject(‘b2’,‘a2’),并使用这些定制对象可以很好地工作(Object of custom type as dictionary key),但比上面的变通方法更复杂.
- 使用定义为不区分位置的集合作为键会产生错误,因为集合是不可散列的.
- 以下问题是相关的,但所有答案都意味着 for each 元组/键多次保存相同的值: How to create dict with 2 keys and one value?和Dictionary with multiple keys mapping to same value
如果存在重复的Stackoverflow问题而我忽略了它,我很感谢任何提示并提前找出借口-很难搜索这个问题,因为我不知道所需的功能将如何调用.