2015-05-22 3 views
2

Допустим, у меня есть список значенийPython - Новый список перестановок с бездействием

my_list = [1,2,3,4] 

I пользователя itertools.permutations найти все комбинации этого списка

perms = itertools.permutations(my_list) 

который создает

[(1, 2, 3, 4), 
(1, 2, 4, 3), 
(1, 3, 2, 4), 
(1, 3, 4, 2), 
(1, 4, 2, 3), 
(1, 4, 3, 2), 
(2, 1, 3, 4), 
(2, 1, 4, 3), 
(2, 3, 1, 4), 
(2, 3, 4, 1), 
(2, 4, 1, 3), 
(2, 4, 3, 1), 
(3, 1, 2, 4), 
(3, 1, 4, 2), 
(3, 2, 1, 4), 
(3, 2, 4, 1), 
(3, 4, 1, 2), 
(3, 4, 2, 1), 
(4, 1, 2, 3), 
(4, 1, 3, 2), 
(4, 2, 1, 3), 
(4, 2, 3, 1), 
(4, 3, 1, 2), 
(4, 3, 2, 1)] 

Я начинаю повторять это и обнаруживаю, что мне больше не нужны какие-либо предметы в perms, которые будут джин с (4,1... или (3,1....

Как я могу воссоздать этот список с этими конкретными упущениями? Итерирование и удаление элементов нецелесообразно, поскольку для этого требуется масштабирование до очень больших размеров.

EDIT: Для разъяснения (4,1,2,3) должны быть удалены, как он начинается с (4,1...), но не (4,2,1,3) как она начинается с (4,2...).

ответ

1

Поскольку вы заявляете

переборе и удаление элементов не является так как это необходимо для шкалы для очень больших размеров.

Лучше всего, чтобы обернуть interator произведенный permutations, который будет генерировать кортежи вы хотите, и пропустить кортежи вы не хотите:

my_list = [1,2,3,4] 

def my_perms(my_list, f): 
    for e in permutations(my_list): 
     if f(e): 
      yield e 

>>> list(my_perms(my_list, lambda t: t[:2] not in {(4,1), (3,1)})) 
[(1, 2, 3, 4), (1, 2, 4, 3), (1, 3, 2, 4), (1, 3, 4, 2), (1, 4, 2, 3), (1, 4, 3, 2), (2, 1, 3, 4), (2, 1, 4, 3), (2, 3, 1, 4), (2, 3, 4, 1), (2, 4, 1, 3), (2, 4, 3, 1), (3, 2, 1, 4), (3, 2, 4, 1), (3, 4, 1, 2), (3, 4, 2, 1), (4, 2, 1, 3), (4, 2, 3, 1), (4, 3, 1, 2), (4, 3, 2, 1)] 

Или используйте ifilter from itertools:

>>> list(ifilter(lambda t: t[:2] not in {(4,1), (3,1)}, permutations(my_list))) 

Или фильтруйте прямо на Python 3+, так как это также создает итератор, а также создает список как фильтр на Python 2.

0

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

>>> [i for i in perms if i[0] not in {3,4}] 
[(1, 2, 3, 4), (1, 2, 4, 3), (1, 3, 2, 4), (1, 3, 4, 2), (1, 4, 2, 3), (1, 4, 3, 2), (2, 1, 3, 4), (2, 1, 4, 3), (2, 3, 1, 4), (2, 3, 4, 1), (2, 4, 1, 3), (2, 4, 3, 1)] 

Обратите внимание, что при использовании set контейнера имеет O (1) для чеки membership.and было бы более эффективной, если у вас есть больше фильтра номера!

Если вы не хотите, кортежи, которые начинаются с 3,1 и 4,1 вы просто можете просто сделать:

>>> perms = it.permutations(my_list) 
>>> [i for i in perms if i[:2] !=[4,1] and i[:2] !=[4,1]] 
[(1, 2, 3, 4), (1, 2, 4, 3), (1, 3, 2, 4), (1, 3, 4, 2), (1, 4, 2, 3), (1, 4, 3, 2), (2, 1, 3, 4), (2, 1, 4, 3), (2, 3, 1, 4), (2, 3, 4, 1), (2, 4, 1, 3), (2, 4, 3, 1), (3, 1, 2, 4), (3, 1, 4, 2), (3, 2, 1, 4), (3, 2, 4, 1), (3, 4, 1, 2), (3, 4, 2, 1), (4, 1, 2, 3), (4, 1, 3, 2), (4, 2, 1, 3), (4, 2, 3, 1), (4, 3, 1, 2), (4, 3, 2, 1)] 
>>> 
+1

Это неправильно. Я думаю, вы опускаете все кортежи, начиная с 3 и 4. – laike9m

+0

@ laike9m Я думаю, что это то, что хочет OP, иначе это не имеет никакого значения, потому что рецепт важен! – Kasramvd

+1

Что я ищу - это удаление чего-либо, начинающегося с '(3,1 ..)' или '(4,1 ...)'. Например. '(4,1,2,3)' следует удалить, но не '(4,2,1,3)' – RockJake28

2
>>> from itertools import permutations 
>>> my_list = [1,2,3,4] 
>>> perms = permutations(my_list) 
>>> perms 
<itertools.permutations object at 0x107a63ad0> 
>>> perms = filter(lambda x: x[:2] != (4,1) and x[:2] != (3,1), perms) 
>>> perms 
[(1, 2, 3, 4), (1, 2, 4, 3), (1, 3, 2, 4), (1, 3, 4, 2), (1, 4, 2, 3), (1, 4, 3, 2), (2, 1, 3, 4), (2, 1, 4, 3), (2, 3, 1, 4), (2, 3, 4, 1), (2, 4, 1, 3), (2, 4, 3, 1), (3, 2, 1, 4), (3, 2, 4, 1), (3, 4, 1, 2), (3, 4, 2, 1), (4, 2, 1, 3), (4, 2, 3, 1), (4, 3, 1, 2), (4, 3, 2, 1)] 
+1

На Python 2 'filter' создаст список, который не тот, о котором заявлял OP. По крайней мере, укажите «ifilter» как более удобный для памяти способ сделать это. – dawg