Как правильно получить все комбинации чисел в Python
Потому что для вашей задачи вам нужно брать не combinations_with_replacement , а product :
import itertools for i in itertools.product('0123456789', repeat=4): print(''.join(i))
Комбинации в комбинаторике не учитывают порядка элементов. Поэтому набор тех же элементов будет считаться одной и той же комбинацией, даже если элементы в другом порядке. Ваш код один раз уже напечатал комбинацию из трёх нулей и одной единицы (0001), поэтому он не будет уже печатать другие варианты этой комбинации — 0010, 0100 и 1000. Аналогично и с другими числами.
Получаем все возможные комбинации из n элементов списка
Итак, нам необходимо вывести все вариации n элементов в некотором списке. Будем считать комбинации вида [a, b, c] и [c, b, a] одинаковыми.
С этой задачей справится модуль itertools и его функция combinations:
>>> import itertools >>> digits = [2,5,8,0] >>> list(itertools.combinations(digits, 3)) # получаем возможные комбинации [(2, 5, 8), (2, 5, 0), (2, 8, 0), (5, 8, 0)] >>> len(list(itertools.combinations(digits, 3))) # получаем количество комбинаций 4
Поиск комбинаций в Python без использования itertools
Есть много случаев, когда нам нужно найти разные комбинации из одной строки или другого набора чисел. Чтобы найти такие комбинации в Python, у нас есть модуль itertools, наиболее распространенный для поиска различных комбинаций и перестановок.
Этот модуль очень эффективен и работает очень быстро, чтобы найти все возможные комбинации. Но функции модуля itertools – не единственный возможный метод, который мы можем использовать для поиска комбинаций.
В этом руководстве мы узнаем о различных методах, с помощью которых мы можем осуществить поиск различных комбинаций из строки в Python без использования itertools.
Комбинации в Python без использования itertools
В этом разделе мы напишем программы Python для поиска комбинаций, реализовав в них несколько методов. В нашей программе на Python мы будем использовать следующие методы:
- итерационный метод;
- метод рекурсии.
В обоих методах сначала мы посмотрим на программу и поймем, что она работает, а затем перейдем к объяснительной части, чтобы понять используемую в ней реализацию.
Поиск с помощью метода итерации
Чтобы реализовать итеративный подход в программе, мы должны импортировать библиотеку numpy, чтобы использовать ее функции.
# Import numpy module in program import numpy as np # Default function to use iterative approach def RecurCombo(iterArray, num): char = tuple(iterArray) # converting input string into a tuple m = len(char) # length of string or tuple if num > m: # checking if length of combinations is more than length of string return index = np.arange(num) # using numpy arrange() function # Yielding the first sequence yield tuple(char[i] for i in index) # Using while loop with true condition while True: # iterating over the tuple we made using reversed for loop for a in reversed(range(num)): if index[a] != a + m - num: break else: return index[a] += 1 # another for loop iteration for b in range(a + 1, num): index[b] = index[b - 1] + 1 yield tuple(char[a] for a in index) # yielding possible combinations from given string # Taking an input string from user inputArray = input("Enter an input string to find combinations: ") # Printing different combinations as result in output print("All possible combinations of three letter sets from the string given by you is: ") print([x for x in RecurCombo(inputArray, 3)])
Enter an input string to find combinations: JavaTpoint All possible combinations of three letter sets from the string given by you is: [('J', 'a', 'v'),('J', 'a', 'a'),('J', 'a', 'T'),('J', 'a', 'p'),('J', 'a', 'o'),('J', 'a', 'i'),('J', 'a', 'n'),('J', 'a', 't')]
Мы использовали метод итерации в приведенной выше программе, чтобы найти комбинации из входной строки.
Во-первых, мы использовали функцию Python по умолчанию с входной строкой и длиной комбинационного набора в качестве параметра. Затем мы преобразовали входную строку в кортеж. Также мы проверили, не превышает ли требуемая длина комбинации длину строки.
После этого мы использовали функцию order() numpy, чтобы установить индекс для кортежа. Мы собираемся перебирать кортеж с индексной переменной.
Затем мы перебирали кортеж, используя обратный цикл for и еще один цикл for внутри цикла while. После итерации в циклах мы получили возможные комбинации нужной длины.
Затем мы взяли строку ввода от пользователя. В последнем действии мы вернули комбинации трех наборов из входной строки.
Использование метода рекурсии
В подходе рекурсивного метода мы будем перебирать список, состоящий из списка строк. Давайте разберем это в следующем примере:
# Default Python function to use recursive approach def RecurCombo(array, num): if num == 0: return [[]] # if length for combination is 0 l =[] # list to printed in result # Using for loop to implement recursive approach for j in range(0, len(array)): emptyArray = array[j] # define an empty array to print list of sets recurList = array[j + 1:] # Recursion method on list defined in function for x in RecurCombo(recurList, num-1): l.append([emptyArray]+x) # appending list return l # list as result of recursion if __name__=="__main__": # Taking an input string from user inputArray = input("Enter an input string to find combinations: ") # Printing different combinations as result in output print("All possible combinations of three letter sets from the string given by you is: ") print(RecurCombo([a for a in inputArray], 3))
Enter an input string to find combinations: Python All possible combinations of three letter sets from the string given by you is: [['P', 'y', 't'], ['P', 'y', 'h'], ['P', 'y', 'o'], ['P', 'y', 'n'], ['P', 't', 'h'], ['P', 't', 'o'], ['P', 't', 'n'], ['P', 'h', 'o'], ['P', 'h', 'n'], ['P', 'o', 'n'], ['y', 't', 'h'], ['y', 't', 'o'], ['y', 't', 'n'], ['y', 'h', 'o'], ['y', 'h', 'n'], ['y', 'o', 'n'], ['t', 'h', 'o'], ['t', 'h', 'n'], ['t', 'o', 'n'], ['h', 'o', 'n']]
В приведенной выше программе при реализации рекурсивного подхода мы не использовали какой-либо конкретный модуль Python. Как и метод итерации, мы использовали функцию по умолчанию для реализации метода рекурсии в коде.
В этой программе мы использовали условие, чтобы проверить, требуется ли длина комбинации. Затем мы использовали метод рекурсии внутри функции с циклом for. После использования метода рекурсии мы возвращали комбинации необходимой длины из входной строки. Наконец, мы взяли строку в качестве ввода от пользователя и вернули на выходе комбинации из трех наборов.
Получить все возможные комбинации элементов списка?
Вечер добрый,
подскажите как проще получить все возможные комбинации элементов списка?
Вот делаю по примерам:
stuff = [0, 1] for L in range(0, len(stuff)+1): for subset in itertools.combinations(stuff, L): print(subset)
()
(0,)
(1,)
(0, 1)
(1, 0)
(0, 0)
(1, 1)
- Вопрос задан более двух лет назад
- 917 просмотров