Поиск значения в списке в словаре Python - PullRequest
0 голосов
/ 28 ноября 2018

Я хочу иметь возможность получить имя человека, которому дан псевдоним (все псевдонимы уникальны).Человек может иметь несколько псевдонимов.Я думал об использовании словаря, подобного следующему

nicknames = {
    'lebron james': ['king james', 'lbj'],
    'dwayne johnson': ['rocky', 'the rock', 'brahma bull']
}

Так, например, учитывая строку 'rocky', я хочу иметь возможность вернуть 'dwayne johnson'.Является ли этот тип структуры данных наиболее оптимальным способом хранения пары имя => псевдонимы?Или есть лучший способ хранения данных, чтобы сделать поиск более эффективным?

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Я думаю, форма ответа @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

Это должно помочь, без предварительного преобразования словаря.Опять же, если поиск будет происходить более одного раза, преобразование словаря до того, как произойдет какой-либо поиск, ускорит последующий поиск, хотя это применимо только в том случае, если псевдонимы уникальны.

0 голосов
/ 28 ноября 2018

Ваш словарь неправильный.Если псевдонимы уникальны, используйте их в качестве ключей.

>>> 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...