2015-04-30 2 views
0

Я пытаюсь разбить список на перечисленные множества, и у меня есть реализация, которая, кажется, делает то, что я хочу, но она не очень «пуфонична», есть ли лучший способ?Python: Разделить список на наборы

В приведенном ниже примере разбивает деталь в наборы максимального размера 3 и возвращает каждый элемент из элементов наряду с заданным номером, и множеству индексам

items = [1,2,3,4,5,6,7,8,9] 

def SplitSets(iterable,set_size): 
    row = 0 
    col = 0 
    for elem in iterable: 
     yield row, col, elem 
     if col == set_size - 1: 
      row = row+1 
     col = (col + 1) % set_size 

for a,b,c in SplitSets(items,3): 
    print a,b,c 
+4

Можете ли вы рассказать нам, какой результат вы хотели? Ваш вопрос довольно неясен, поскольку он стоит. –

+1

Вы не создаете объекты 'set', что многие разработчики Python ожидали бы от вас, когда вы используете этот термин. Вы пытаетесь сгруппировать свой список в куски? –

+0

Martijn, Правильно, плохое использование терминологии от моего имени. Я пытаюсь сортировать список элементов в группах с максимальным размером указанного числа. Use Case заключается в том, что я хочу иметь список кнопок, которые будут отсортированы в x количество строк с максимальным числом в каждой строке. – scotty3785

ответ

4

не так много, чтобы объяснить, используются только деление и модуль найти номер строки и столбца

items = [1,2,3,4,5,6,7,8,9] 

def SplitSets(iterable,set_size): 
    #return a generator 
    return ((i/set_size, i%set_size,e) for i,e in enumerate(iterable)) 

for a,b,c in SplitSets(items,3): 
    print a,b,c 

аналогичный код:

items = [1,2,3,4,5,6,7,8,9] 

def SplitSets(iterable,set_size): 
    for i, elem in enumerate(iterable): 
     yield i/set_size, i%set_size, elem 

for a,b,c in SplitSets(items,3): 
    print a,b,c 
+0

возможно изменить 3 до set_size – daphshez

+0

@DaphnaShezaf сделано, я исправлен;) –

+0

Код OP создает генератор. Возможно, вы также должны изменить его на 'return ((i/... ble))' –

1

Одним из решений является использование itertools:

from itertools import count, cycle, izip 

def split_sets(iterable, set_size): 
    for a, b, c in izip(count(), cycle(range(set_size)), items): 
     yield a // set_size, b, c 

items = [1, 2, 3, 4, 5, 6, 7, 8, 9] 
set_size = 3 
for a, b, c in split_sets(items, set_size): 
    print a, b, c 

Обсуждение

  • Для первого столбца (а), мы призываем count(), который возвращает 0, 1, 2, 3, 4 ... тогда число разделить с set_size, чтобы получить то, что мы хотим
  • для второго столбца, range(set_size) возвращается [0, 1, 2] для set_size из 3. cycle() функции повторите эту последовательность снова и снова.
  • Не требуется объяснений для последнего столбца
  • Теперь, если мы возьмем эти столбцы и izip (что более эффективно, чем zip для Python 2.x), мы получим то, что хотим.