我希望能够获得一个昵称的人的名字(所有昵称都是唯一的)。一个人可以有多个昵称。我当时正在考虑使用类似以下的字典
nicknames = {
'lebron james': ['king james', 'lbj'],
'dwayne johnson': ['rocky', 'the rock', 'brahma bull']
}
例如,给定一个字符串'rocky'
,我希望能够返回'dwayne johnson'
。这种数据结构是存储name => nicknames配对的最佳方法吗?还是有更好的方法来存储数据以提高搜索效率?
答案 0 :(得分:5)
您的字典是错误的方法。如果昵称是唯一的,请使用它们作为密钥。
>>> nicknames = {
...: 'lebron james': ['king james', 'lbj'],
...: 'dwayne johnson': ['rocky', 'the rock', 'brahma bull']
...:}
>>>
>>> nicknames = {nick:real for real, lst in nicknames.items() for nick in lst}
>>> nicknames
{'brahma bull': 'dwayne johnson',
'king james': 'lebron james',
'lbj': 'lebron james',
'rocky': 'dwayne johnson',
'the rock': 'dwayne johnson'}
>>>
>>> nicknames['rocky']
'dwayne johnson'
答案 1 :(得分:0)
我认为答案形式@timgeb是正确的。但是,如果不建议对字典进行转换,则可以随时搜索它,我认为这对性能的影响与首先进行转换相同。
nicknames_by_name = {...}
def find_name(nickname_to_find);
for name, nicknames in nicknames_by_name.items():
for nickname in nicknames:
if nickname == nickname_to_find:
return name
这应该可以解决问题,而无需先转换字典。再一次,如果搜索要进行一次以上,则在任何搜索发生之前对字典进行一次转换将使后续搜索更快,尽管这仅在昵称是唯一的情况下适用。