根据特定位置在列表中包含空值 (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']
或者,您可以压缩 IncompleteList
和 MyList
并将配对列表转换为字典。接下来迭代 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:
最坏情况下会扫描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 建议的第二个解决方案)。
我有以下列表:
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']
或者,您可以压缩 IncompleteList
和 MyList
并将配对列表转换为字典。接下来迭代 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:
最坏情况下会扫描
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 建议的第二个解决方案)。