Создание всех комбинаций списка в python

Вот вопрос:

Учитывая список элементов в Python, как мне пройти, чтобы получить все возможные комбинации элементов?

На этом сайте есть несколько похожих вопросов, которые предлагают использовать itertools.combine, но это возвращает только часть того, что мне нужно:

stuff = [1, 2, 3] for L in range(0, len(stuff)+1): for subset in itertools.combinations(stuff, L): print(subset) () (1,) (2,) (3,) (1, 2) (1, 3) (2, 3) (1, 2, 3) 

Как вы видите, он возвращает только элементы в строгом порядке, не возвращая (2, 1), (3, 2), (3, 1), (2, 1, 3), (3, 1, 2), ( 2, 3, 1) и (3, 2, 1). Есть ли какое-то обходное решение? Кажется, я ничего не могу придумать.

7 Solutions collect form web for “Создание всех комбинаций списка в python”

Используйте itertools.permutations :

 >>> import itertools >>> stuff = [1, 2, 3] >>> for L in range(0, len(stuff)+1): for subset in itertools.permutations(stuff, L): print(subset) ... () (1,) (2,) (3,) (1, 2) (1, 3) (2, 1) (2, 3) (3, 1) .... 

помощь по itertools.permutations :

 permutations(iterable[, r]) --> permutations object Return successive r-length permutations of elements in the iterable. permutations(range(3), 2) --> (0,1), (0,2), (1,0), (1,2), (2,0), (2,1) >>> 

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

 import itertools a = [1,2,3,4] for i in xrange(1,len(a)+1): print list(itertools.combinations(a,i)) 

Результат:

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

itertools.permutations этого вы ищете itertools.permutations ?

Из help(itertools.permutations) ,

 Help on class permutations in module itertools: class permutations(__builtin__.object) | permutations(iterable[, r]) --> permutations object | | Return successive r-length permutations of elements in the iterable. | | permutations(range(3), 2) --> (0,1), (0,2), (1,0), (1,2), (2,0), (2,1) 

Образец кода :

 >>> from itertools import permutations >>> stuff = [1, 2, 3] >>> for i in range(0, len(stuff)+1): for subset in permutations(stuff, i): print(subset) () (1,) (2,) (3,) (1, 2) (1, 3) (2, 1) (2, 3) (3, 1) (3, 2) (1, 2, 3) (1, 3, 2) (2, 1, 3) (2, 3, 1) (3, 1, 2) (3, 2, 1) 

Из Википедии разница между перестановками и комбинациями:

Перестановка:

Неформально перестановка множества объектов – это расположение этих объектов в определенном порядке. Например, существует шесть перестановок множества {1,2,3}, а именно (1,2,3), (1,3,2), (2,1,3), (2,3,1) , (3,1,2) и (3,2,1).

Комбинация:

В математике комбинация – это способ выбора нескольких вещей из большей группы, где (в отличие от перестановок) порядок не имеет значения.

itertools.permutations будет тем, что вы хотите. По математическому определению порядок не имеет значения для combinations , то есть (1,2) считается идентичным (2,1) . В то время как при permutations каждое отдельное упорядочение считается единственной перестановкой, поэтому (1,2) и (2,1) совершенно разные.

Вот решение без itertools

Сначала давайте определим перевод между вектором-индикатором от 0 до 1 с и под-списком ( 1 если элемент находится в подсписке)

 def indicators2sublist(indicators,arr): return [item for item,indicator in zip(arr,indicators) if int(indicator)==1] 

Затем определим отображение из числа от 0 до 2^n-1 в его двоичное векторное представление (используя функцию format строки):

 def bin(n,sz): return ('{d:0'+str(sz)+'b}').format(d=n) 

Все, что у нас осталось, – это перебрать все возможные числа, а indicators2sublist

 def all_sublists(arr): sz=len(arr) for n in xrange(0,2**sz): b=bin(n,sz) yield indicators2sublist(b,arr) 

Я предполагаю, что вы хотите, чтобы все возможные комбинации были «наборами» значений. Вот фрагмент кода, который я написал, который может помочь вам понять:

 def getAllCombinations(object_list): uniq_objs = set(object_list) combinations = [] for obj in uniq_objs: for i in range(0,len(combinations)): combinations.append(combinations[i].union([obj])) combinations.append(set([obj])) return combinations 

Вот пример:

 combinations = getAllCombinations([20,10,30]) combinations.sort(key = lambda s: len(s)) print combinations ... [set([10]), set([20]), set([30]), set([10, 20]), set([10, 30]), set([20, 30]), set([10, 20, 30])] 

Я думаю, у этого есть n! сложность времени, поэтому будьте осторожны. Это работает, но может быть не самым эффективным

просто подумал, что я поместил бы это там, так как я не смог бы прекратить КАЖДЫЙ возможный результат и имея в виду, что у меня есть только самые базовые знания, когда дело доходит до python, и есть, вероятно, гораздо более элегантное решение … (также извините имена слабых переменных

тестирование = [1, 2, 3]

testing2 = [0]

n = -1

def testingSomethingElse (число):

 try: testing2[0:len(testing2)] == testing[0] n = -1 testing2[number] += 1 except IndexError: testing2.append(testing[0]) 

в то время как True:

 n += 1 testing2[0] = testing[n] print(testing2) if testing2[0] == testing[-1]: try: n = -1 testing2[1] += 1 except IndexError: testing2.append(testing[0]) for i in range(len(testing2)): if testing2[i] == 4: testingSomethingElse(i+1) testing2[i] = testing[0] 

я ушел с == 4, потому что я работаю с целыми числами, но вам, возможно, придется изменить это соответственно …

  • Как я могу бесконечно петли итератор в Python, через генератор или другой?
  • поиск и замена элементов в списке (python)
  • Как изменить переменные, поданные в цикл for в форме списка
  • python изменить элемент в списке, сохранить обратно в списке
  • Python: могу ли я изменить Tuple?
  • Python объединяет два списка со всеми возможными перестановками
  • Создайте список кортежей из двух вложенных списков
  • Python -Интеграция нескольких списков?
  •  
    Interesting Posts for Van-Lav

    Python – настройка свойств из списка приводит к превышению максимальной глубины рекурсии

    ipython: как установить ширину терминала

    Как преобразовать трехмерный вектор в поворот Эйлера в программном обеспечении, таком как майя, используя python

    Проблема с попыткой изменить язык из шаблона Django

    Проблема кодирования в движке приложения при отправке форм multipart / form-data

    Простота создания Django интерфейса RESTful

    Аранжировка букв самым выразительным способом?

    Panda Dataframe Повторная выборка на основе критериев столбцов

    Перемещение легенды matplotlib за пределами оси заставляет ее обрезать блок фигуры

    динамический вызов функций и функции генератора (python)

    Создание повторяющихся дат с использованием python?

    Как отсортировать OrderedDict of OrderDict – Python

    Функции из пакетов Python для udf () фрейма Spark

    Есть ли библиотека python xmpp, которая поддерживает добавление / удаление пользователей?

    Ошибка сокета: адрес уже используется

    Python - лучший язык программирования в мире.