"Dictionary" 的名称等效

"Dictionary" of name equivalency

我有一个括号格式的名字列表,例如Adam (Lawrence, Albert), Erwin (Heintz, Edwin, Bro)等。此处括号中的名称等同于主名称(Adam = Lawrence = Albert)。我如何存储这种数据类型,以便我可以轻松地双向访问它。例如。如果我存储为普通字典 ({'Adam':'Lawrence, Albert'}),我可以在 O(1) 中访问 'Adam' 的等价物,但要访问 'Lawrence' 的等价物,我必须搜索中的所有值词典。是否有像 {'Adam':'Lawrence':'Albert', 'Erwin':'Heintz':'Edwin':'Bro'} 这样的数据类型,我可以在其中轻松搜索任何等效项?

一个简单的选择是制作一个以所有选项为键的字典:

In [17]: names = ['Adam (Lawrence, Albert)', 'Erwin (Heintz, Edwin, Bro)']

In [18]: d = {}

In [19]: for name_s in names:
    ...:     namelist = name_s.replace(" (", ", ")[:-1].split(", ")
    ...:     for name in namelist:
    ...:         d[name] = namelist
    ...:

In [20]: d
Out[20]:
{'Adam': ['Adam', 'Lawrence', 'Albert'],
 'Lawrence': ['Adam', 'Lawrence', 'Albert'],
 'Albert': ['Adam', 'Lawrence', 'Albert'],
 'Erwin': ['Erwin', 'Heintz', 'Edwin', 'Bro'],
 'Heintz': ['Erwin', 'Heintz', 'Edwin', 'Bro'],
 'Edwin': ['Erwin', 'Heintz', 'Edwin', 'Bro'],
 'Bro': ['Erwin', 'Heintz', 'Edwin', 'Bro']}

这应该仍然是相对内存高效的,因为每个重复的列表都指向相同的底层内存位置:

In [21]: d['Adam'].append("hi")

In [22]: d
Out[22]:
{'Adam': ['Adam', 'Lawrence', 'Albert', 'hi'],
 'Lawrence': ['Adam', 'Lawrence', 'Albert', 'hi'],
 'Albert': ['Adam', 'Lawrence', 'Albert', 'hi'],
 'Erwin': ['Erwin', 'Heintz', 'Edwin', 'Bro'],
 'Heintz': ['Erwin', 'Heintz', 'Edwin', 'Bro'],
 'Edwin': ['Erwin', 'Heintz', 'Edwin', 'Bro'],
 'Bro': ['Erwin', 'Heintz', 'Edwin', 'Bro']}