python - 如何从列表中提取其值包含项目的相应键?
问题描述
我有一个清单和一本字典。对于列表中的每个项目,我想在字典中检索其值包含该项目的键。
我尝试编写从列表中获取项目并每次循环遍历字典以查看值是否包含该项目并返回键的代码。我认为这将是 O(n2) 复杂度。
my_list = ['1.1.1.1','2.2.2.2','3.3.3.3']
my_dict = {
1234 : '4.4.4.4,5.5.5.5,2.2.2.2',
4567 : '6.6.6.6,7.7.7.7,1.1.1.1',
8910 : '8.8.8.8,9.9.9.9,3.3.3.3'
}
def get_key(my_list, my_dict):
for item in my_list:
for key, value in my_dict.items():
temp_list = []
temp_list = value.split(',')
if item in temp_list:
print(key)
get_key(my_list, my_dict)
Output:
4567
1234
8910
对于 2.2.2.2 项,应返回密钥 1234,依此类推。
有没有更优化的方法来实现这一点?
解决方案
由于您正在寻找完全匹配的内容,因此您可以反转字典进行搜索。转换一次是 O(n),但之后查找是 O(1)。
inverse = {
value: key
for key, values in my_dict.items()
for value in values.split(',')
}
鉴于这种倒置结构,您可以直接从列表中查找键:
for item in my_list:
print(inverse[item])
所有项目的反转和查找都是 O(n)。由于循环没有嵌套,因此总复杂度保持在 O(n) 总计。
推荐阅读
- python-3.x - Spyder:不同的结果取决于我使用 F5 还是 F9 运行代码
- docker - docker build 没有创建图像
- swift - 是否可以在我的应用程序中播放 AppleMusics?如果是,那我该怎么玩?
- coq - 在 sort Prop 中决定析取
- azure - 服务主体中 API 调用的 Azure 审核日志记录
- java - 如何在 Java 中使用 Jsoup 获取函数数据的值
- python - 如何使用 Pandas 基于列将两个数据框添加在一起?
- java - 如何编写正则表达式以匹配 yaml 文件中的键?
- swift - 如何在 Cocoa 菜单栏应用程序中处理修饰键
- sapui5 - 如何处理引导程序的 data-sap-ui-libs 与清单的 sap.ui5/dependencies/libs?