2016-10-27 10 views
0

Я использую python (2.7.2), и мне нужны все перестановки без повторения из списка. Точнее,Python itertools перестановки с двойными элементами

for i in itertools.permutations([1,2,3]): print i 

правильно дает

(1, 2, 3) 
(1, 3, 2) 
(2, 1, 3) 
(2, 3, 1) 
(3, 1, 2) 
(3, 2, 1) 

Но теперь я ищу что-то будет делать следующее

for i in myfunction([1,2,2]): print i 
(1,2,2) 
(2,2,1) 
(2,1,2) 

В то время как itertools дал бы этот список дважды (или, ([ 1,1,1]) в качестве входного сигнала, он просто повторяется шесть раз). Это в основном что-то между itertools.permutations и itertools.combinations. Я пробовал работать с наборами, но все решения, которые я пытался, всегда создавали новые проблемы и никогда не соответствовали желаемому результату.

+1

Не можете вы просто фильтровать результат через 'set'? 'for i in set (itertools.permutations ([1,2,2]): print i' –

+0

Работы. Спасибо, как-то не удалось добраться туда в начале и закончил путь к сложным решениям. – Eulenfuchswiesel

+1

Существует эффективный способ сделать это в [этот старый мой ответ] (http://stackoverflow.com/a/31678111/4014959) –

ответ

1

Похоже, вы хотите комплект.

s = [] 
for i in itertools.permutations([1,2,2]): 
    s.append(i) 
print(set(s)) 

Что дает:

{(1, 2, 2), (2, 2, 1), (2, 1, 2)} 

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

for i in set(itertools.permutations([1,2,2])): 
    print(i) 
+1

Есть ли причина, по которой вы не просто вставляете непосредственно в набор? Какова цель списка? –

+0

Я отредактировал свой ответ, чтобы включить прямой метод, но причина заключалась в том, чтобы показать, как сохранить объект с требуемой информацией. – Andy

+0

Зачем вам нужно сохранять объекты? –

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

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