2017-02-09 10 views
-2

Я ищу способ группировать числа из списка, перебирая их, если они попадают в диапазон.Определить группы чисел в списке?

, например, здесь приведен список номеров:

days = [18, 19, 26, 9, 15, 16, 22, 2, 9, 15, 16, 23, 28, 30, 6, 13, 19, 20, 25,27, 
     4, 11, 17, 18, 25, 1, 8, 14, 15, 22, 27, 29, 6, 13, 19, 20, 26, 27, 
     3, 10, 16, 17, 24, 25, 31, 7, 14, 20, 21, 26, 28, 5, 12, 18, 19, 26, 
     2, 9, 15, 16, 23, 27, 30, 7, 14, 20, 21, 28] 

В то время как цикл по списку, я хочу, чтобы сгруппировать их в список кортежей, если число больше 1, что и меньше, чем 32 например [(18, 19, 26), (9, 15, 16, 22)] и т.п ...). У кого-нибудь есть разумный способ сделать это?

Я пробовал использовать рецепты из библиотеки itertools, но сработал.

пример:

for k, g in groupby(enumerate(days), lambda (i,x):x in date_range): 
    print map(itemgetter(1), g) 

этот пример будет генерировать списки последовательных чисел. Я ценю любую помощь.

+5

Что определяет длину каждого кортежа? В вашем примере это кажется случайным ... –

+0

* например [(18, 19, 26), (9, 15, 16, 22)] и т. Д. * Я не могу понять, что * и т. Д. * Будет , –

+0

Разделяете ли вы, когда два значения не являются инкрементальными? –

ответ

-1
last_day = 0 
sublist = [] 
result = [] 
for day in days: 
    if day > last_day: 
     sublist.append(day) 
    else: 
     result.append(tuple(sublist)) 
     sublist = [day] 
    last_day = day 
result.append(tuple(sublist)) # append the final list 

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

Результат:

[(18, 19, 26), (9, 15, 16, 22), (2, 9, 15, 16, 23, 28, 30), 
(6, 13, 19, 20, 25, 27), (4, 11, 17, 18, 25), (1, 8, 14, 15, 22, 27, 29), 
(6, 13, 19, 20, 26, 27), (3, 10, 16, 17, 24, 25, 31), 
(7, 14, 20, 21, 26, 28), (5, 12, 18, 19, 26), 
(2, 9, 15, 16, 23, 27, 30), (7, 14, 20, 21, 28)] 
+0

Помимо этого вопроса, уже имеющего ответ в связанном дубликате, это конкретное решение завершится неудачно, если последняя группа имеет один элемент. – TigerhawkT3

+0

Спасибо TemporWolf, это правильный ответ, простите, если вопрос не был достаточно ясным, но мои, например, [(18, 19, 26)] и т. Д.) Должны были быть достаточно большой подсказкой. – crisis

+0

@ TigerhawkT3 Достаточно честный, но это может быть исправлено, и это значительно менее сложно, чем все опубликованные ответы на вопрос dupe'd. По крайней мере, вопрос об обмане должен быть открыт, если он станет авторитетным источником. – TemporalWolf

 Смежные вопросы

  • Нет связанных вопросов^_^