从以列表为值的字典中获取键
Get the key from a dictionary with list as value
考虑以下词典。
dict = {
'key_1': ['name1', 'name2', 'name3'],
'key_2': ['name4', 'name5', 'name6']
}
给定一个名为“name6”的字符串,如何通过较少的循环轻松判断这是属于“key_2”的键。我有以下代码,我该如何优化它的时间限制。上面的代码只是一个例子,字典中有几个这样的键。
dict = {
'key_1': ['name1', 'name2', 'name3'],
'key_2': ['name4', 'name5', 'name6']
}
output_key = None
for key in dict:
if 'name6' in dict[key]:
output_key = key
break
这消除了循环,根据其他答案似乎更快,特别是对于小型词典,但是(免责声明)我没有进行基准测试或执行任何性能测试。
使用next
获取匹配的第一个值,或默认值(None
):
mydict = {
'key_1': ['name1', 'name2', 'name3'],
'key_2': ['name4', 'name5', 'name6']
}
output_key = next(
(mykey for mykey, myval in mydict.items() if 'name6' in myval),
None
)
print(output_key) # key_2
在这个字典的当前形式中,如果不遍历键就找不到存储“name6”的键。
你需要一个不同的数据结构,你可以创建另一个字典,其中键是原始字典中的每个唯一字符串,值是在原始字典中保存该字符串的键列表,这样你就可以检查它O1 中新字典中的字符串,并获取旧字典中所有包含该字符串的键列表。
创建新字典的时间复杂度为 O(n)(其中 n 是原始字典包含的字符串数),但由于它也是您执行的搜索的成本,所以这仍然是一个胜利,如果您需要查找 m 个值,您必须在 O(m*n) 之前执行,但在其之后执行 O(max(m,n))
dictionary = {
'key_1': ['name1', 'name2', 'name3'],
'key_2': ['name4', 'name5', 'name6']
}
new_dict = dict()
for key in dictionary:
for value in dictionary[key]:
if value in new_dict:
new_dict[value].append(key)
else:
new_dict[value] = [key]
如果您从一开始就知道每个值只能在一个键中(在原始字典中),则不需要列表,但最好有以防万一;)
考虑以下词典。
dict = {
'key_1': ['name1', 'name2', 'name3'],
'key_2': ['name4', 'name5', 'name6']
}
给定一个名为“name6”的字符串,如何通过较少的循环轻松判断这是属于“key_2”的键。我有以下代码,我该如何优化它的时间限制。上面的代码只是一个例子,字典中有几个这样的键。
dict = {
'key_1': ['name1', 'name2', 'name3'],
'key_2': ['name4', 'name5', 'name6']
}
output_key = None
for key in dict:
if 'name6' in dict[key]:
output_key = key
break
这消除了循环,根据其他答案似乎更快,特别是对于小型词典,但是(免责声明)我没有进行基准测试或执行任何性能测试。
使用next
获取匹配的第一个值,或默认值(None
):
mydict = {
'key_1': ['name1', 'name2', 'name3'],
'key_2': ['name4', 'name5', 'name6']
}
output_key = next(
(mykey for mykey, myval in mydict.items() if 'name6' in myval),
None
)
print(output_key) # key_2
在这个字典的当前形式中,如果不遍历键就找不到存储“name6”的键。
你需要一个不同的数据结构,你可以创建另一个字典,其中键是原始字典中的每个唯一字符串,值是在原始字典中保存该字符串的键列表,这样你就可以检查它O1 中新字典中的字符串,并获取旧字典中所有包含该字符串的键列表。
创建新字典的时间复杂度为 O(n)(其中 n 是原始字典包含的字符串数),但由于它也是您执行的搜索的成本,所以这仍然是一个胜利,如果您需要查找 m 个值,您必须在 O(m*n) 之前执行,但在其之后执行 O(max(m,n))
dictionary = {
'key_1': ['name1', 'name2', 'name3'],
'key_2': ['name4', 'name5', 'name6']
}
new_dict = dict()
for key in dictionary:
for value in dictionary[key]:
if value in new_dict:
new_dict[value].append(key)
else:
new_dict[value] = [key]
如果您从一开始就知道每个值只能在一个键中(在原始字典中),则不需要列表,但最好有以防万一;)