Sas*_*gov 83
您可以通过子类化dict和添加所需的逻辑来创建自己的字典类型.这是一个基本的例子:
class TwoWayDict(dict):
def __setitem__(self, key, value):
# Remove any previous connections with these values
if key in self:
del self[key]
if value in self:
del self[value]
dict.__setitem__(self, key, value)
dict.__setitem__(self, value, key)
def __delitem__(self, key):
dict.__delitem__(self, self[key])
dict.__delitem__(self, key)
def __len__(self):
"""Returns the number of connections"""
return dict.__len__(self) // 2
Run Code Online (Sandbox Code Playgroud)
它的工作原理如下:
>>> d = TwoWayDict()
>>> d['foo'] = 'bar'
>>> d['foo']
'bar'
>>> d['bar']
'foo'
>>> len(d)
1
>>> del d['foo']
>>> d['bar']
Traceback (most recent call last):
File "<stdin>", line 7, in <module>
KeyError: 'bar'
Run Code Online (Sandbox Code Playgroud)
我确定我没有涵盖所有情况,但这应该让你开始.
Nad*_*mli 43
在您的特殊情况下,您可以将它们存储在一个字典中:
relation = {}
relation['Alice'] = 'Bob'
relation['Bob'] = 'Alice'
Run Code Online (Sandbox Code Playgroud)
因为你所描述的是对称关系. A -> B => B -> A
Ian*_*and 22
我会填充第二个哈希值
reverse_map = dict((reversed(item) for item in forward_map.items()))
Run Code Online (Sandbox Code Playgroud)
Nea*_*roo 17
我知道这是一个较老的问题,但我想提一下这个问题的另一个很好的解决方案,即python包bidict.它非常直接使用:
from bidict import bidict
map = bidict(Bob = "Alice")
print(map["Bob"])
print(map.inv["Alice"])
Run Code Online (Sandbox Code Playgroud)
小智 9
一种不太冗长的方法,仍然使用反向:
dict(map(reversed, my_dict.items()))
Run Code Online (Sandbox Code Playgroud)
假设您可以节省内存,两个哈希映射实际上可能是性能最快的解决方案.我会将它们包装在一个类中 - 程序员的负担是确保两个哈希映射正确同步.
你有两个不同的问题.
你有一个"对话"对象.它指的是两个人.由于Person可以进行多次对话,因此您具有多对多关系.
您有一个从人员到对话列表的地图.转换将有一对人.
做这样的事情
from collections import defaultdict
switchboard= defaultdict( list )
x = Conversation( "Alice", "Bob" )
y = Conversation( "Alice", "Charlie" )
for c in ( x, y ):
switchboard[c.p1].append( c )
switchboard[c.p2].append( c )
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
37134 次 |
| 最近记录: |