根据特定位置在列表中包含空值 (Python)

Include empty values in a list according to specific positions (Python)

我有以下列表:

CompleteList=['00:00:00', '00:00:01', '00:00:02', '00:00:03',....,'23:59:59']

我还有以下列表:

IncompleteList=['00:00:00', '00:00:01', '00:00:03',....,'23:59:59']

可以看出,CompleteList 具有 IncompleteList 中缺少的值,例如值“00:00:02”。

我还有第三个数组:

MyList=['22', '33', '25',....,'13']

我需要的是通过以下方式在 MyList 中的 IncompleteList 缺失值的位置包含空值:

MyList_result=['22', '33','','25',....,'13']

我是通过以下方式实现的:

MyList_result=[]

for item in CompleteList:
    if item in IncompleteList:
        ind=IncompleteList.index(item)   
        v=MyList[ind]
        MyList_result.append(v)

    else:
        v=''
        MyList_result.append(v)

这可行,但考虑到我正在使用的列表的大小,它花费的时间太长。我真的需要找到一种更有效的方法。任何帮助将不胜感激。

第一个直观的方法是将 IncompleteList 转换为一个集合并获得 MyList 的迭代器。然后它成为迭代 CompleteList 的线性操作,如果 CompleteList 中的 elem 出现在 IncompleteList 中,则从 MyList 迭代器中吐出下一个项目,否则按照您的示例一个空字符串

示例代码

IncompleteList=['00:00:00', '00:00:01', '00:00:03','23:59:59']
IncompleteSet = set(IncompleteList)
MyList=['22', '33', '25','13']
CompleteList=['00:00:00', '00:00:01', '00:00:02', '00:00:03','23:59:59']
MyListIt = iter(MyList)
[next(MyListIt) if cl_elem in IncompleteSet else '' for cl_elem in CompleteList]

示例输出

Out[100]: ['22', '33', '', '25', '13']

或者,您可以压缩 IncompleteListMyList 并将配对列表转换为字典。接下来迭代 CompleteList 并从字典中吐出相应的值(如果元素存在)否则为空字符串

MyDict = dict(zip(IncompleteList, MyList))

[MyDict.get(k, '') for k in CompleteList]
Out[108]: ['22', '33', '', '25', '13']

您的实施瓶颈在两个地方:

  • 您正在检查 IncompleteList 中的 CompleteList 中的每个项目

    if item in IncompleteList:
    

    最坏情况下会扫描IncompleteListn次(如果nCompleteList中的元素个数)

  • 如果该项目存在,您会在

    处找到该项目的索引
    ind = IncompleteList.index(item)
    

    这涉及对 IncompleteList

  • 的另一次扫描

@Abhijit 建议的第一个解决方案解决了第二个问题,您无需再次扫描列表即可获取索引。然而,检查项目在 IncompleteList/IncompleteSet 中的存在仍然是一个瓶颈。

如果我们可以假定排序列表,那么以下解决方案会更快,但会稍微复杂一些:

MyList_result = []
incomplete_list_index = 0
incomplete_list_length = len(IncompleteList)
for item in CompleteList:
    if incomplete_list_index < incomplete_list_length and IncompleteList[incomplete_list_index] == item:
        MyList_result.append(MyList[incomplete_list_index])
        incomplete_list_index += 1
    else:
        MyList_result.append('')

这只涉及 CompleteList 的单次传递(并且没有预处理来生成 Dict 作为@Abhijit 建议的第二个解决方案)。