2015-01-22 16 views
9

Mam problem z zagadką, którą chcę rozwiązać za pomocą pythona. Dają 4 numery (25, 28, 38, 35) i chcą, abyśmy umieścili liczby w ... + ...-... = ... Jednym z możliwych rozwiązań jest 25 + 38-35 = 28. Ive próbował, tworząc listę z numerami, iteracyjne je z niektórych pętli i jeżeli: LST = [25, 28, 38, 35]Python: iteracja poprzez listę

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 

Ale kiedy Uruchom pętli powtarzają liczby (25 + 25-25 = 25) i to nie działa. Jak mogę to rozwiązać?

+11

Look w itertools.permutations – user2097159

+0

Dość oprócz najlepszego sposobu patrzenia na wszystkich permutacji w Pythonie, należy rozważyć (poprzez dodanie "c" po obu stronach równania), że szukasz dwóch wartości z czterech, które razem sumują do połowy sumy. Więc nie potrzebujesz wszystkich 24 permutacji, możesz wziąć pod uwagę tylko 6 partycji: pierwsze 6 wartości z 'itertools.permutations (lst, 2)'. A jeśli wartości są liczbami całkowitymi, a suma jest nieparzysta, to zapomnij o tym :-) –

Odpowiedz

9

Jako komentarz Luis' zasugerował, dobrym rozwiązaniem jest

import itertools 

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

"mieszkanie jest lepszy niż zagnieżdżone", jak import this w interaktywnym wierszu Python będzie Ci przypominać :-)

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]) 

Szybkie i brudny hack na moim telefonie komórkowym, może być elegancko rozbudowany o numery k, nietestowany, ale powinien działać.

Edit: zrozumiał to nie będzie działać, jeśli nie ma solution.infinite rekurencja ...