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 № 1import 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"]