#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)]
если вы этого хотите.