Разделенный список Python до и после определенного значения

#python #python-3.x #list

#питон #python-3.x #Список

Вопрос:

Я хочу разделить список на кортежи после и перед определенным значением.

Пример

Ввод:

 list1 = [2, 1, 1, 2, 1, 2, 1, 1]
print(some_func(list1, 2))
 

Выходной сигнал:

 >> [(2,1,1), (1,1,2,1), (1,2,1,1)]
 

введите описание изображения здесь

итак, я хочу, чтобы каждый кортеж был разделен на «2», но также сохранял другие значения в кортеже. Как я могу легко добиться этого?

Любая помощь приветствуется

Комментарии:

1. какова логика для этих разделений?

2. Что вы пробовали до сих пор? Почему не работает получение индексов, а затем вырезание подсписков?

3. Каковы требования к разделению

4. Пытаюсь понять логику здесь. Итак, для каждого вхождения 2 вам нужен кортеж, содержащий это 2 и все не-2, которые предшествуют и следуют за ним?

5. Хорошим началом является поиск индексов всех 2-х: [i for i, v in enumerate(list1) if v == 2]

Ответ №1:

 def split_on(lst, val):
    try:
        # get a tuple between the start of lst and the second occurrence of val
        first_idx = lst.index(val)
        remainder = lst[first_idx   1:]
        second_idx = remainder.index(val)   (first_idx   1)
        # and recur with the rest of the list beyond the first occurrence
        return [tuple(lst[:second_idx])]   split_on(remainder, val)
    except ValueError: 
        # base case: there's zero or one occurrences of val, 
        # so we just return the whole lst as a tuple
        return [tuple(lst)]

split_on([2,1,1,2,1,2,1,1], 2)
# [(2, 1, 1), (1, 1, 2, 1), (1, 2, 1, 1)]
 

Обратите внимание, что это не очень эффективное решение, и для очень больших списков оно начнет работать довольно медленно, поскольку нарезка списка является дорогостоящей операцией. Что-то в itertools может помочь с другим, более эффективным подходом.

Ответ №2:

Вы можете найти индексы 2s, а затем связать каждый индекс с тем, который равен двум, чтобы сформировать поддиапазоны:

 def neighbors(aList,value):
    indices = [-1]   [i for i,v in enumerate(aList) if v == value]   [len(aList)]
    return [ tuple(aList[s 1:e]) for s,e in zip(indices,indices[2:]) ]

list1 = [2, 1, 1, 2, 1, 2, 1, 1]

print(neighbors(list1,2))

[(2, 1, 1), (1, 1, 2, 1), (1, 2, 1, 1)]
 

Обратите внимание, что это вернет пустой список, если значения нет в списке. Вам нужно будет добавить условие для возврата всего списка, if len(indices)<3: return [tuple(aList)] если вы этого хотите.