Разделить список на списки, содержащие только 1s

#python #python-3.x #list #grouping

#python #python-3.x #Список #группировка

Вопрос:

У меня есть этот список на python:

 [100, 96, 1, 1, 1, 2, 4, 1, 1, 1, 1, 55, 1]
  

Как я мог бы разделить данный список (и другие списки, содержащие 1s), чтобы я получал вложенные списки, содержащие только соседние 1s — так что результат будет:

    [ [1, 1, 1], [1, 1, 1, 1], [1] ]
  

Я предполагаю, что я ищу, чтобы создать функцию, которая каким-то образом определяла бы «внешние» 1s как точки разделения списка:

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

Ответ №1:

Я предполагаю, что может быть подход, использующий maybe itertools takewhile / dropwhile или что-то еще, но этот простой цикл for делает это:

 l = [100, 96, 1, 1, 1, 2, 4, 1, 1, 1, 1, 55, 1]

res = []
tmp = []

for i in l:
  if i == 1:
    tmp.append(i)
  elif tmp:
    res.append(tmp)
    tmp = []

if tmp:
  res.append(tmp)

print(res)
  

Вывод:

 [[1, 1, 1], [1, 1, 1, 1], [1]]
  

Ответ №2:

Идеальный случай для itertools.groupby :

 from itertools import groupby

inputlist = [100, 96, 1, 1, 1, 2, 4, 1, 1, 1, 1, 55, 1]

result = [list(grp) for val, grp in groupby(inputlist) if val == 1]
  

groupby без ключа просто группирует прогоны с одним и тем же значением, получая одну копию значения и итератор этого прогона значений в каждом цикле. Вы проверяете, является ли это запуском 1 s (отбрасывая любые группы, которые не являются), и если это так, перечислите группу, чтобы создать следующий подраздел list .

Ответ №3:

Попробуйте это:

 def get_one_lists(the_list):
    result = []                        # Initialize list of lists
    among_ones = False                 # Flag whether we are now among 1's
    for e in the_list:
        if e == 1:
            if among_ones:
                result[-1].append(1)   # Already among 1's. Append this 1 too.
            else:
                result.append([1])     # Stumbled upon a new sequence of 1's
                among_ones = True
        else:
            among_ones = False
    return result
  

Тестирование:

 my_list = [100, 96, 1, 1, 1, 2, 4, 1, 1, 1, 1, 55, 1]
print(get_one_lists(my_list))
my_list = [1, 100, 96, 1, 1, 1, 2, 4, 1, 1, 1, 1, 55, 1]
print(get_one_lists(my_list))
    
  

Вывод:

 [[1, 1, 1], [1, 1, 1, 1], [1]]
[[1], [1, 1, 1], [1, 1, 1, 1], [1]]