Найти, какой элемент списка является ключом в словаре и какова его ценность - PullRequest
3 голосов
/ 19 февраля 2020

У меня есть словарь:

classes_dictionary = {'/m/09x0r': 'Speech', '/m/03qc9zr': 'Screaming'}

и список:

labels_list = ['/m/03k3r', '/m/04rlf', '/m/07q5rw0', '/m/09x0r', '/m/0jbk']

labels_list всегда будет содержать хотя бы один элемент, который является ключом classes_dictionary. sh, чтобы извлечь классы с наименьшей вычислительной сложностью. В этом примере '/m/09x0r' будет переведено в 'Speech'. Мое решение:

class_str = list()
for k in labels_list:
    print(k)
    if k in self.classes_dictionary:
        class_str.append(self.classes_dictionary[k])

Я не против, если вывод представляет собой список или любой другой тип. Кроме того, для общности вопроса я предполагаю, что только один элемент labels_list является ключевым, хотя лучший ответ может рассмотреть оба случая.

Есть ли более эффективный способ реализовать это? Я спрашиваю об обоих, эффективность реализации

Ответы [ 6 ]

1 голос
/ 19 февраля 2020

Использование понимания списка:

>>> [classes_dictionary[k] for k in labels_list if k in classes_dictionary]
['Speech']

Если ожидается только одно совпадение, вы можете использовать next с выражением генератора, чтобы остановить поиск, как только он будет найден:

>>> next(classes_dictionary[k] for k in labels_list if k in classes_dictionary)
'Speech'
1 голос
/ 19 февраля 2020

Вы можете использовать get() и проверить, не является ли возвращенное значение None, вместо того, чтобы посмотреть, существует ли ключ в dict (хотя это операция O (1)). Если вы знаете, что это только одно значение, добавьте break

class_str = []
for k in labels_list:
    value = classes_dictionary.get(k)
    if value:
        class_str.append(value)

Если вы используете Python 3.8, вы можете использовать Выражения присваивания , которые будут оценивать classes_dictionary.get(x) только один раз

class_str = [y for x in labels_list if (y := classes_dictionary.get(x)) is not None]
0 голосов
/ 19 февраля 2020

вы можете использовать пересечение клавиш dict с элементами из labels_list в понимании списка:

class_str = [classes_dictionary[e] for e in set(classes_dictionary).intersection(labels_list)]

вывод:

['Speech']
0 голосов
/ 19 февраля 2020

Если вместо этого установлен labels_list, вы можете выжать немного производительности. Используйте пересечение ключей набора и словаря:

classes_dictionary = {'/m/09x0r': 'Speech', '/m/03qc9zr': 'Screaming'}
labels_list= set(['/m/03k3r', '/m/04rlf', '/m/07q5rw0', '/m/09x0r', '/m/0jbk'])

[classes_dictionary[k] for k in labels_list & classes_dictionary.keys()]
0 голосов
/ 19 февраля 2020

В настоящее время ваш label_list состоит из одной строки. Кажется, это должен быть список из 5 строк. Вы не нуждаетесь в себе. перед class_dictionary:

class_str = list()
for k in labels_list:
  print(k)
  if k in classes_dictionary:
    class_str.append(classes_dictionary[k])
0 голосов
/ 19 февраля 2020

Для эффективной проверки ключа на dict.

#YOUR CODE
if k in self.classes_dictionary:
    #do_job

#More efficient
try:
    self.classes_dictionary[k]
    #do_job
except:
    #Key not in dict
    pass
...