在 Python 中查找另一个出现次数或“无”的项目列表中的索引子列表

Find sublist of indices for a list of items in another list with multiple occurrences or None in Python

提问人:John Kuldeep Roshan Kerketta 提问时间:8/4/2020 更新时间:8/4/2020 访问量:55

问:

在 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]]
python list python-2.7 nested-lists 子列表

评论

2赞 azro 8/4/2020
你试过什么?

答:

0赞 Balaji Ambresh 8/4/2020 #1

给你:

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]]
0赞 arshovon 8/4/2020 #2

如果 和 中的项目数量较小,则可以应用蛮力解决方案。我们可以搜索 in 的每个元素,然后将 的索引存储在一个空列表中。然后,我们可以将此列表附加到是否有任何搜索结果。否则,我们将附加一个只有元素的列表。list1list2list2list1list1found_item_index[None]found_item_index

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)

0赞 Rakesh 8/4/2020 #3

使用简单迭代

前任:

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]]
0赞 MisterNox 8/4/2020 #4

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

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 
0赞 Rahul Vishwakarma 8/4/2020 #5

将 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