在Python中,为另一个多次出现或无的列表中的项列表查找索引的子列表



从list1中的list2查找项,并在子列表中为list2中的每个项返回索引。如果未发现任何事件,则返回None。

list1 = ['fq','ab','opn','ef','cd','ef','opn','kl','fq','str','opn','ab','cd']
list2 = ['ab','cd','ef','ed','fq']
found_item_index = [code]  
found_item_index = [[1,11], [4,12], [3,5], [None], [0]]

开始:

list1 = ['fq', 'ab', 'opn', 'ef', 'cd', 'ef', 'opn', 'kl', 'fq', 'str', 'opn', 'ab', 'cd']
list2 = ['ab', 'cd', 'ef', 'ed', 'fq']
def find_index(lst, item):
pos = [i for i, lst_item in enumerate(lst) if lst_item == item]
return pos or [None]
found_item_index = [find_index(list1, item) for item in list2]
print(found_item_index)

输出

[[1, 11], [4, 12], [3, 5], [None], [0, 8]]

如果list1list2中的项目数较小,则可以应用蛮力解决方案。我们可以在list1中搜索list2的每个元素,然后将list1的索引存储在一个空列表中。然后,如果有任何搜索结果,我们可以将此列表附加到found_item_index。否则,我们将向found_item_index添加一个仅包含[None]元素的列表。

list1 = ['fq','ab','opn','ef','cd','ef','opn','kl','fq','str','opn','ab','cd']
list2 = ['ab','cd','ef','ed','fq']
found_item_index = []
for search_item in list2:
search_result = []
for i in range(len(list1)):
if search_item == list1[i]:
search_result.append(i)
if len(search_result)>0:
found_item_index.append(search_result)
else:
found_item_index.append([None])

print(found_item_index)

输出:

[[1, 11], [4, 12], [3, 5], [None], [0, 8]]

时间复杂度:O(n*n)

使用简单的迭代

例如:

list1 = ['fq','ab','opn','ef','cd','ef','opn','kl','fq','str','opn','ab','cd']
list2 = ['ab','cd','ef','ed','fq']

check_val = {}                             #--> {'fq': [0, 8], 'ab': [1, 11], 'opn': [2, 6, 10], 'ef': [3, 5], 'cd': [4, 12], 'kl': [7], 'str': [9]}
for idx, val in enumerate(list1):
check_val.setdefault(val, []).append(idx)
found_item_index = [check_val.get(i, [None]) for i in list2]      
print(found_item_index)

输出:

[[1, 11], [4, 12], [3, 5], [None], [0, 8]]

使用NumPy作为:

import numpy as np
found_item_index = []
for i in range(len(list2)):
found_item_index.append(list(np.where(np.array(list1) == list2[i])[0]) 
if list(np.where(np.array(list1) == list2[i])[0]) else None)
found_item_index

这将为您提供所需的输出:

list1 = ['fq','ab','opn','ef','cd','ef','opn','kl','fq','str','opn','ab','cd'] 
list2 = ['ab','cd','ef','ed','fq']
output = [([i for i, x in enumerate(list1) if x == obj] if obj in list1 else [None]) for obj in list2]
print output 

最新更新