2016-04-21 4 views
1

Мне нужно найти набор разделов с фиксированными размерами блоков. Например, установите S = (1,2,3,4,5,6,7), и я хочу разбить его как блок (4,2,1). ОтветыУстановить раздел с фиксированным размером

([1,2,3,4][5,6][7]) 
([2,3,4,5][6,7][1]) 
([1,4,5,6][2,3][7]) 
..................... 
..................... 

Никто не знает, как его решить в Python. Пожалуйста, дайте несколько подсказок

+0

Так что вы хотите получить список с тремя элементами, каждый элемент представляет собой набор и размер этих множеств 4, 2 и 1. И как наборы неупорядочены, (1,2,3,4) и (4,1,3,2) будут одинаковыми. Я правильно понял ваши требования? –

+0

Да (1,2,3,4) и (4,1,2,3) обрабатывается как один и тот же набор. Спасибо –

ответ

2

Попробуйте следующую функцию:

from itertools import permutations 

def take(l, partition): 
    if len(partition) == 1: 
    for p in permutations(l): 
     yield (p,) 
    else: 
    for p in permutations(l,partition[0]): 
     for t in take([x for x in l if x not in p], partition[1:]): 
     yield (p,) + t 

Тогда take([1,2,3,4,5,6,7],(4,2,1)) должно быть то, что вы ищете.

EDIT: Different решение теперь требования лучше понять:

from itertools import permutations 

def take(l, partition): 
    offsets = [0] 
    for x in partition: 
    offsets.append(offsets[-1]+x) 
    for p in permutations(l): 
    yield frozenset([frozenset(p[offsets[i]:offsets[i+1]]) for i in range(len(offsets)-1)]) 


for x in frozenset(take([1,2,3,4,5],(3,1,1))): 
    print([[z for z in y] for y in x]) 
+0

ИЛИ вы могли бы просто использовать '[(p [0: 4], p [4: 6], p [6: 8]) для p в перестановках (a)] '. Я думаю, что в своем ответе я преувеличивал ... –

+0

Спасибо, попробуем это –

+0

Пожалуйста, скажите мне, как удалить дубликат, если я беру ввод ввода ([1,2,3], (2,1)), он получается как ((1, 2), (3,)) ((1, 3), (2,)) ((2, 1), (3)) ((2, 3), (1,)) ((3, 1), (2,)) ((3, 2), (1,)) –

4

Вы должны переставить свой стол в 7 * 6 * 5 * 4 * 3 * 2 * 1 способами, а затем каждый стол нарезать на части.

Например:

def permute(table): 
    return [[],[],[],[],...]//table of permuted tables 


def cut_into_parts(lengths_list, table): 
    rlist = [] 
    for i in lengths_list[:-1]: 
     rlist.append(table[:-len(table) + i]) 
     table = table[i:] 
    rlist.append(table[:lengths_list[-1]]) 
    return rlist 

Я надеюсь, что это легко путь и полезно. Пожалуйста, пометить его, если это

+0

Спасибо, позволь мне попробовать этот путь. –

+0

параметр списка во второй функции - это список длин таблиц после резки – Piotrowy

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