查找列表的哪个元素是字典中的键以及它的值是什么
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']
我有字典:
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']