2016-11-12 3 views
0
main_list = ['4', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10'] 
my_list = ['4', '5', '6'] 

Мой вопрос в том, как найти индекс my_list в главном каталоге?Поиск индекса первого элемента списка в другом списке

Целые числа в my_list должны быть последовательно в главном списке.

Я пробовал использовать main_list.index(my_list[0]), но если есть более одного определенного элемента, он возвращает неправильный номер индекса. Результат, который мне нужно получить, равен 4, однако с main_list.index(my_list[0]) он просто укажет 0 как его индекс.

Если есть необходимость в разъяснении, я могу отредактировать сообщение с дополнительной информацией. Извините, английский не является моим первым языком.

+0

Итерации над тремя предметными частями '' '' main_list''' и сравните их с '' 'my_list'''. – wwii

ответ

2

попробовать что-то вроде этого

for i in range(len(main_list)-len(my_list)): 
    if main_list[i:i+len(my_list)] == my_list: 
     index = i 
     break 

Это должно работать для всех возможных типов, которые могли бы пойти в списках.

+0

, вы должны объявить индекс как 'index = -1' для случая, когда он не найден. –

1

Вы можете преобразовать оба списка в строку с помощью join() function и итеративно сравнить строки, чтобы найти соответствие.

РЕДАКТИРОВАТЬ: Сделано изменение для этого два работы для многозначных чисел. Добавлен поплавок.

Например:

main_list = ['4', '1', '2', '3', '40.1', '52', '61', '7', '8', '9', '10'] 
my_list = ['40.1', '52', '61'] 
index = -1 

for i in range(len(main_list)): 
    if '#'.join(main_list[i:i+len(my_list)]) == '#'.join(my_list): 
     index = i 
     break 

print(index) 
+0

Большое спасибо. Это отличный способ решить эту проблему. – karleh

+0

Если это сработало для вас, отметьте как ответ. Благодаря! –

+0

Что делать, если в списке есть числа с плавающей точкой? Тогда, безусловно, нужно будет использовать другой метод? – karleh

0

Если вы хотели бы получить решение алгоритма:

def Find(haystack, needle): 
    n, h = len(needle), len(haystack) 
    assert n <= h 

    for i in range(h): 
     if h - i <= n: break 
     count = 0 
     for i_, j in zip(range(i, i + n), range(n)): 
      if haystack[i_] == needle[j]: 
       count += 1 
     if count == n: return i 

    return -1 
0

Гораздо более эффективный один лайнер:

print ','.join(main_list).find(','.join(my_list)) - ''.join(main_list).find(''.join(my_list)) 

преобразует их в строки с элементами, разделенных запятыми, находит появление, а затем вычитает возникновение найденного когда запятые не там, и у вас есть ответ.

Смежные вопросы