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

时间:2015-12-03 15:53:10

标签: python list position find missing-data

我有以下列表:

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)

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

2 个答案:

答案 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']

或者,您可以同时压缩IncompleteListMyList,并将配对列表转换为字典。如果元素存在,则继续遍历CompleteList并从字典中吐出相应的值,否则为空字符串

MyDict = dict(zip(IncompleteList, MyList))

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

答案 1 :(得分:1)

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

  • 您正在检查CompleteListIncompleteList处的每件商品

    if item in IncompleteList:
    

    在最坏的情况下会扫描IncompleteList n次(如果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建议的第二种解决方案)。