Как выбрать последовательные числа из списка

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

index_list=[3,4,8,9,35,36,37]

из которого я хочу вывод как

[3:4], [8:9], [35:37]

--------------------- МОТИВ: ---------------------

У меня есть еще один основной список слов, в котором 80 слов.

  master_list=['was,'it','to,'go,'I'.........] 

Таким образом, последовательные индексы помогут мне выбрать нужные слова из master_list как

master_list[3:4], master_list[8:9], master_list[35:37]

person vinita    schedule 04.02.2019    source источник
comment
Каким должен быть формат ожидаемого результата?   -  person taurus05    schedule 04.02.2019
comment
@ taurus05 [3: 4, 8: 9, 35:37] подойдет   -  person vinita    schedule 04.02.2019
comment
почему вы пропустили 36? Уточните, пожалуйста.   -  person taurus05    schedule 04.02.2019
comment
Эти числа являются последовательными, а не параллельными. Кроме того, что не так с [3:37] в качестве вывода? Как вы решаете, когда начинать новый срез?   -  person ForceBru    schedule 04.02.2019
comment
@ForceBru новый срез появляется, когда есть перерыв в конструктивности   -  person vinita    schedule 04.02.2019
comment
@ taurus05 Я не пропустил 36, я написал [35:37], что означает 35,36,37   -  person vinita    schedule 04.02.2019
comment
@vinita ожидаете ли вы на выходе двухмерного списка начальных и конечных индексов последовательных элементов? Пример: - [[3:4],[8:9],[35:37]]?   -  person taurus05    schedule 04.02.2019
comment
@ taurus05 да, подойдет   -  person vinita    schedule 04.02.2019
comment
@vinita, какой результат вы ожидаете от входного списка [1,3,5,7,9]? Должно быть [[1, 1], [3, 3], [5, 5], [7, 7], [9, 9]]   -  person taurus05    schedule 04.02.2019


Ответы (2)


Вероятно, есть много способов сделать это. Вот пример, основанный на reduce() и islice():

from functools import reduce
from itertools import islice

qw = [3, 4, 8, 9, 12, 13, 14]

master_list = ['Thus', 'the', 'consecutive', 'indices', 'will', 'help', 'me', 'pick', 'out', 'the', 'required', 'words', 'from', 'master_list', 'as']

def divide(value, element):
    if not value[-1] or element - value[-1][-1] == 1:
        value[-1].append(element)
    else:
        value.append([element])

    return value

slices = [(array[0], array[-1]) for array in reduce(divide, qw, [[]])]

print(slices)

for sliced in slices:
    print(list(islice(master_list, *sliced)))

ВЫХОД

% python3 test.py
[(3, 4), (8, 9), (12, 14)]
['indices']
['out']
['from', 'master_list']
%

Обратите внимание, что это обрабатывает второе число в срезе обычным для Python образом, так что оно выходит за рамки того, что мы хотим. Если это действительно последний элемент из того, что вы хотите, измените этот элемент с помощью + 1:

(array[0], array[-1] + 1)
person cdlane    schedule 04.02.2019
comment
Большое спасибо. Что делать, если у меня есть список = [3, 4, 5, 16, 17, 31, 32, 33, 34] и мне нужны индексы последовательных чисел как список списка. [[0,1,2], [3,4], [5,6,7,8]]. Не могли бы вы предложить и для этого случая? - person vinita; 04.02.2019
comment
@vinita, это выпадает бесплатно, потому что это то, что возвращает reduce(divide, qw, [[]]): [[3, 4, 5], [16, 17], [31, 32, 33, 34]] до того, как понимание списка очистит это для islice(). - person cdlane; 04.02.2019

Используя очень обобщенный способ:

i = 0
final_list = []
flag = True
while flag:
    temp_list = [index_list[i]]
    while (i < len(index_list)-1) and (index_list[i+1] - index_list[i]==1):
        i+=1

    temp_list.append(index_list[i])
    final_list.append(temp_list)
    i+=1
    if i >= len(index_list):
        flag=False

print(final_list)

input : [3,4,8,9,35,36,37]
ouptut : [[3, 4], [8, 9], [35, 37]]

input : [1,3,5,7,9]
output : [[1, 1], [3, 3], [5, 5], [7, 7], [9, 9]]

Обновлять:

new_list = []
for i, j in final_list:
    new_list.append(list(range(i,j+1)))
print(new_list)

input:  [3, 4, 5, 16, 17, 31, 32, 33, 34] 
output : [[3, 4, 5], [16, 17], [31, 32, 33, 34]]
person taurus05    schedule 04.02.2019
comment
Большое спасибо. Что делать, если у меня есть список = [3, 4, 5, 16, 17, 31, 32, 33, 34] и мне нужны индексы последовательных чисел как список списка. [[0,1,2], [3,4], [5,6,7,8]]. Не могли бы вы предложить и для этого случая? - person vinita; 04.02.2019
comment
Это легко! Я внес необходимые изменения @vinita. - person taurus05; 04.02.2019