Элементы группы списка с python размера шага?

Учитывая список входных данных

l = [1 2 3 4 5 6 7 8 9 10] 

и групповой размер grp и шаг шага

 grp = 3; step = 2 

Я хотел бы вернуть список. Обратите внимание на повторение в конце

 1 2 3 3 4 5 5 6 7 7 8 9 9 10 1 

или если

 grp= 4; step = 2 

Выход должен быть

 1 2 3 4 3 4 5 6 5 6 7 8 7 8 9 10 

Это код, который я придумал, он не выполняет циклическую вещь. Но хотелось бы знать, есть ли меньшее или простое решение

 def grouplist(l,grp,step): oplist = list() for x in range(0,len(l)): if (x+grp<len(l)): oplist.append(str(l[x:x+grp])) return oplist 

3 Solutions collect form web for “Элементы группы списка с python размера шага?”

Вы можете воспользоваться функцией шага в xrange или диапазоне в зависимости от того, какую версию python вы используете. Затем, чтобы обернуть вокруг мода по длине списка, например, так

 import sys def grouplist(l,grp,step): newlist=[] d = len(l) for i in xrange(0,len(l),step): for j in xrange(grp): newlist.append(l[(i+j)%d]) sys.stdout.write(str(l[(i+j)%d]) + ' ') print l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] print grouplist(l,3,2) 1 2 3 3 4 5 5 6 7 7 8 9 9 10 1 [1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 9, 9, 10, 1] print grouplist(l,4,2) 1 2 3 4 3 4 5 6 5 6 7 8 7 8 9 10 9 10 1 2 [1, 2, 3, 4, 3, 4, 5, 6, 5, 6, 7, 8, 7, 8, 9, 10, 9, 10, 1, 2] 
 def grouplist(L, grp, step): starts = range(0, len(L), step) stops = [x + grp for x in starts] groups = [(L*2)[start:stop] for start, stop in zip(starts, stops)] return groups def tabulate(groups): print '\n'.join(' '.join(map(str, row)) for row in groups) print 

Пример вывода:

 >>> tabulate(grouplist(range(1,11), 3, 2)) 1 2 3 3 4 5 5 6 7 7 8 9 9 10 1 >>> tabulate(grouplist(range(1,11), 4, 2)) 1 2 3 4 3 4 5 6 5 6 7 8 7 8 9 10 9 10 1 2 

используя deque:

 from itertools import islice from collections import deque def grps(l, gps, stp): d = deque(l) for i in range(0, len(l), stp): yield list(islice(d, gps)) d.rotate(-stp) 

вывод:

 In [7]: l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] In [8]: list(grps(l, 3, 2)) Out[8]: [[1, 2, 3], [3, 4, 5], [5, 6, 7], [7, 8, 9], [9, 10, 1]] In [9]: list(grps(l, 4, 2)) Out[9]: [[1, 2, 3, 4], [3, 4, 5, 6], [5, 6, 7, 8], [7, 8, 9, 10], [9, 10, 1, 2]] 

Вы также можете присоединиться к объекту islice и решить, что вы хотите сделать с ним за пределами:

 def grps(l, gps, stp): d = deque(l) for i in range(0, len(l), stp): yield islice(d, gps) d.rotate(-stp) 

Вывод:

 In [11]: for gp in grps(l, 3,2): ....: print(" ".join(map(str,gp))) ....: 1 2 3 3 4 5 5 6 7 7 8 9 9 10 1 

Или просто с модулем:

 def grps(l, gps, stp): ln = len(l) for i in range(0, len(l), stp): yield (l[j % ln] for j in range(i, i + gps)) for gp in grps(l, 4, 2): print(" ".join(map(str, gp))) 
  • Сгенерировать список временных интервалов между интервалом
  • Ввод элементов из файла в порядке убывания без встроенных функций
  • Использование .format () для форматирования списка с аргументами ширины поля
  • создать новый список без изменения исходного списка
  • Ротация списка Python
  • Фильтрация и преобразование списков Python
  • Ссылка на элемент в списке кортежей
  • Являются ли атрибуты класса Python совместно или нет?
  • Python - лучший язык программирования в мире.