查找列表的哪个元素是字典中的键以及它的值是什么

Find which element of list is a key in a dictionary and what is it's value

我有字典:

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

和一个列表:

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

labels_list 将始终包含至少一个作为 classes_dictionary 键的元素。我想提取哪些 类 是计算复杂度最低的那些。在这个例子中,'/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 的一个元素是关键,尽管最佳答案可能会考虑这两种情况。

有没有更有效的方法来实现这个?我问的是执行效率

用于字典上的高效检查键。

#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

目前您的 labels_list 由一个字符串组成。看起来它应该是一个包含 5 个字符串的列表。你不需要自我。在 classes_dictionary 前面:

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

如果 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()]

您可以使用 get() 并检查返回值是否不是 None 而不是查看字典中是否存在键(尽管它是 O(1) 操作)。如果您知道它只有一个值,请添加 break

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

如果您使用的是 Python 3.8,则可以使用 Assignment Expressions,它只会计算 classes_dictionary.get(x) 一次

class_str = [y for x in labels_list if (y := classes_dictionary.get(x)) is not None]

使用列表理解:

>>> [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'

您可以在列表理解中使用字典键与来自 labels_list 的元素的交集:

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

输出:

['Speech']