首页 > 解决方案 > 如果存在于字典列表中,则检查和附加列表中的项目的最佳代码

问题描述

这些是我的输入,印刷精美以提高可读性

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])

虽然它可以工作,但感觉并不是最优化也不是最干净的代码编写方式。我为这个基本问题道歉,我不是一个很有经验的程序员。

标签: pythonpython-3.xoptimization

解决方案


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)

这也具有预期的线性复杂度。


推荐阅读