python - 如果存在于字典列表中,则检查和附加列表中的项目的最佳代码
问题描述
这些是我的输入,印刷精美以提高可读性
input1 = [{
"ID": "1",
"SequenceNum": 1
},
{
"ID": "2",
"SequenceNum": 2
},
{
"ID": "3",
"SequenceNum": 3
},
{
"ID": "4",
"SequenceNum": 4
}]
input2 = ['4', '1']
中包含的input2
值基本上是中'ID'
看到的键的值input1
输出将是一个字典列表,其中input1[index]['ID'] == input2[index_element]
.
预期输出 ->[{"ID": "4","SequenceNum": 4},{"ID": "1","SequenceNum": 1}]
我已经使用以下代码行解决了这个问题:
match_list = []
for idx,val in enumerate(input1):
match_list.append(val['ID'])
return_list = []
for idx,val in enumerate(input2):
if val in match_list:
get_idx = match_list.index(val)
return_list.append(input1[get_idx])
虽然它可以工作,但感觉并不是最优化也不是最干净的代码编写方式。我为这个基本问题道歉,我不是一个很有经验的程序员。
解决方案
IIUC,你可以这样做:
s = set(input2)
res = [d for d in input1 if d["ID"] in s]
print(res)
输出
[{'ID': '1', 'SequenceNum': 1}, {'ID': '4', 'SequenceNum': 4}]
这具有预期的线性复杂度。
如果input2
需要保留订单,您可以执行以下操作:
lookup = {d["ID"]: d for d in input1}
res = [lookup[i] for i in input2 if i in lookup]
print(res)
这也具有预期的线性复杂度。
推荐阅读
- android - 自定义列表视图中的搜索过滤器
- java - Stream anyMatch 因“不兼容的类型”错误而失败
- php - 如何翻译成西班牙语背包?
- mongodb - 一次删除多个文档 mongodb atlas
- php - 如何使用 preg_replace 替换另一个链接?
- azure - 无法将私有注册表凭据传递到 Azure IoT Edge
- ruby-on-rails - 使用 RubyZip 生成文件并以 zip 格式下载
- android - 是否有任何一步一步的东西可以将情感分析和语音实施到我当前基于谷歌云视觉的人脸识别应用程序项目中?
- while-loop - System Verilog中while循环的额外迭代
- ios - Swift - Mopub 原生广告已成功加载,但未显示在视图中