2015-01-22 5 views
9

У меня загадка для загадок, которую я хочу решить с помощью python. Они дают 4 номера (25, 28, 38, 35), и они хотят, чтобы мы поместили числа в ... + ...-... = ... Одно из возможных решений - 25 + 38-35 = 28. I've пытался, составьте список из чисел, перебирать их с некоторыми контурами и, если: LST = [25, 28, 38, 35]Python: итерация по списку

for z in lst: 
    for x in lst: 
     for c in lst: 
      for v in lst: 
       if z+x-c==v: 
        print z,x,c,v 

Но когда Запускает для петель они повторяются числа (25 + 25-25 = 25), и это не работает. Как я могу это решить?

+11

Посмотрите в itertools.permutations – user2097159

+0

Совсем в стороне от лучшего способа посмотреть на все перестановки в Python, рассмотрит (путем добавления 'c' с обеих сторон уравнения), что вы ищете любые два значения из четырех, которые вместе составляют до половины суммы. Таким образом, вам не нужны все 24 перестановки, вы можете рассмотреть только 6 разделов: первые 6 значений из 'itertools.permutations (lst, 2)'. И если значения целые и сумма нечетна, то забудьте об этом :-) –

ответ

9

Как комментарий Луиса намекнул, хороший подход

import itertools 

for z, x, c, v in itertools.permutations(lst): 
    if z+x-c==v: 
     print z,x,c,v 

"плоский лучше, чем вложенный", а import this на интерактивном режиме Python будет напоминать вам :-)

1
Def recadd(lis): 
     If lis[0] + lis[1] - lis[2]] = lis[3]: 
       return lis 
     Else: 
       recadd(lis[3] + lis[0:2]) 
       recadd(lis[0] + lis[3] + lis[1:2]) 
       recadd(lis[0:1] + lis[3]. + lis[2]) 

Быстрый и грязный хак на моем мобильном телефоне, может быть элегантно расширен за k номеров, непроверенных, но он должен работать.

Edit: понял, что это не будет работать, если нет solution.infinite рекурсии ...

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