Найти подсписок индексов для списка элементов в другом списке с несколькими вхождениями или Нет в Python - PullRequest
0 голосов
/ 04 августа 2020

Искать элементы из списка2 в списке1 и возвращать индексы в подсписке для каждого элемента в списке2. Если вхождения не найдено, верните 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]]

Ответы [ 5 ]

0 голосов
/ 04 августа 2020

Используйте 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
0 голосов
/ 04 августа 2020

Это дает вам желаемый результат:

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 голосов
/ 04 августа 2020

Решение методом перебора может применяться, если количество элементов в list1 и list2 меньше. Мы можем искать каждый элемент list2 в list1, а затем сохранять индексы list1 в пустом списке. Затем мы можем добавить этот список в found_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 голосов
/ 04 августа 2020

Использование простой итерации

Пример:

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 голосов
/ 04 августа 2020

Здесь вы go:

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]]
...