我有以下列表:
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)
这可行但考虑到我正在使用的列表的大小需要很长时间。我真的需要找到一种更有效的方法。任何帮助将不胜感激。
答案 0 :(得分:2)
第一种直观的方法是将IncompleteList
转换为集合并获取MyList
的迭代器。然后,如果来自CompleteList
的元素出现在MyList
中,则根据您的示例,它会迭代CompleteList
并从IncompleteList
迭代器中吐出下一个项目一个空字符串
示例代码
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']
或者,您可以同时压缩IncompleteList
和MyList
,并将配对列表转换为字典。如果元素存在,则继续遍历CompleteList
并从字典中吐出相应的值,否则为空字符串
MyDict = dict(zip(IncompleteList, MyList))
[MyDict.get(k, '') for k in CompleteList]
Out[108]: ['22', '33', '', '25', '13']
答案 1 :(得分:1)
您实施的瓶颈有两个地方:
您正在检查CompleteList
中IncompleteList
处的每件商品
if item in IncompleteList:
在最坏的情况下会扫描IncompleteList
n
次(如果n
是CompleteList
中的元素数
如果该项目存在,您可以在
找到该项目的索引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建议的第二种解决方案)。