#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]]