/ / Encontrando todas as combinações possíveis em python - python

Encontrando todas as combinações possíveis em python - python

Eu estou tentando encontrar todas as combinações de números em uma lista que dá um certo número em python 2.7. Tentei combinações de itertool mas não consigo descobrir, então aqui vai.

mylist=[1,2,3,4,5,6,7,8,9,10]
number=60 # for 3 elements

results=[[3,4,5],[2,3,10],[2,5,6],[1,6,10]...]

eu tentei

import itertools

num = [1, 2, 3, 4, 5,6,7,8,9,10]
combinations = []

for combination in itertools.combinations(num, 3):
combinations.append(int("".join(str(i) for i in combination)))
print combinations

# ...
combination=[123,124,125....]

Respostas:

3 para resposta № 1
import itertools

num = [1, 2, 3, 4, 5,6,7,8,9,10]
combinations = itertools.combinations(num, 3)
matching = [c for c in combinations if reduce(lambda x, y: x * y, c, 1) == 60]

print(matching)

A linha mágica é a matching = [c for c in combinations if reduce(lambda x, y: x * y, c, 1) == 60]. É uma compreensão da lista, equivalente a:

matching = []
for c in combinations:
if reduce(lambda x, y: x * y, c, 1) == 60:
matching.append(c)

Você pode encontrar documentação sobre o reduce função Aqui


0 para resposta № 2

Embora tenha sido respondido, aqui está um algoritmo recursivo para encontrar combinações:

def findCombination(product, numList, length, minimum):
if length == 0 and product == 1:
return [[]]
if length == 1 and product in numList and product > minimum:
return [[product]]

ret = []
subList = [item for item in numList if item > minimum]
for n in subList:
if product % n == 0:
temp = findCombination(product / n, subList, length - 1, n)
for x in temp:
ret += [[n] + x]
return ret

Para que funcione corretamente, mylist tem que ser classificado, porque as combinações são feitas em ordem crescente.

>>> mylist=[1,2,3,4,5,6,7,8,9,10]
>>> mylist = sorted(mylist)
>>> number = 60
>>> print findCombination(number, mylist, 3, mylist[0])
[[1, 6, 10], [2, 3, 10], [2, 5, 6], [3, 4, 5]]

-1 para resposta № 3
>>> import itertools
>>> numbers = 1,2,3,4,5,6,7,8,9

>>> combinations =  itertools.combinations(numbers,3)

>>> ["".join([str(a),str(b), str(c)]) for a, b, c in combinations if a*b*c == 60]
["256", "345"]

Isso funcionará com N combinações necessárias

>>> import itertools, operator
>>> numbers = 1,2,3,4,5,6,7,8,9,10
>>> multiply_must_be = 60

>>> combinations = itertools.combinations(numbers, 3)

>>> combine = lambda arr: "".join([str(item) for item in arr])
>>> multiply = lambda arr: reduce(operator.mul, arr, 1)

>>> [combine(combo) for combo in combinations if multiply(combo) == multiply_must_be]
["1610", "2310", "256", "345"]