Do sprawdzenia kod

0

Jest takie zadanie: mamy podaną listę np. [1,3,5,2,11,7] . Należy sprawdzić czy suma, którychkolwiek liczb na liście wynosi 9. Jak wyszczególnić czy suma kazdej z liczb a i b na liscie zgadza się z wynikiem wynik_sumy, bądz nie... Nie chcę podglądać gotowca z sieci, bo nie o to chodzi... Tak sobie dla luzu dziś cwiczę różne zadanka :) Macie jakies uwagi, spostrzeżenia śmiało piszcie :)

#Zbadaj czy na liscie liczb, znajdują się dwie liczby których suma wynosi liczba wynik_sumy czyli: 9 (7+2)

def suma_dwoch_liczb(liczby,wynik_sumy):
    n = len(liczby) 

    for i in range(0, n-1):
        if liczby[i] + liczby[i +1] != wynik_sumy:
            print('Suma liczb jest rozna od ',wynik_sumy)
    else:
            print('Suma jest równa',wynik_sumy)
  

suma_dwoch_liczb([1,3,5,2,11,7],9)
2

Użyj kombinacji:

from itertools import combinations

comb = combinations([1, 3, 5, 2, 11, 7], 2)
for i in comb:
    print(i)
0

Dzięki, na szybko wyszło mi takie cos:

#Zbadaj czy na liscie liczb, znajdują się dwie liczby których suma wynosi liczba wynik_sumy czyli: 9 (7+2)
from itertools import combinations

def suma_dwoch_liczb(liczby,wynik_sumy):
    n = len(liczby) 

    comb = combinations([1, 3, 5, 2, 11, 7], 2)
    for i in comb:
        print(i)
    for i in range(0, n-1):
        if liczby[i] + liczby[i +1] != wynik_sumy:
            print('Suma liczb,liczb jest rozna od ',wynik_sumy)
    else:
            print('Znaleziono sumę liczb wyniku liczb: ',liczby[3],'i',liczby[5],'=' ,wynik_sumy)
  

suma_dwoch_liczb([1,3,5,2,11,7],9)

Czy jest możliwoć , żeby kod tak przekształcić żeby np. przy wyliczeniu z comba pokazało mi przy danych , ze te wyliczenie jest rózne od 9, a przy którym pokazało mi , ze znaleziono wynik liczb: 9

Przykładowo:

(1, 3)  - jest rozna
(1, 5) - jest rozna
(1, 2)  - jest rozna
(1, 11)  - jest rozna
(1, 7) - jest rozna
(3, 5) itp....
(3, 2)
(3, 11)
(3, 7)
(5, 2)
(5, 11)
(5, 7)
(2, 11)
(2, 7) -  Znaleziono sumę liczb , która wynosi 9
(11, 7) itp...

Albo spróbuję przerobić kod od początku , żeby mozna było dostać takie wyniki jak wyżej. Jakies podpowiedzi?, druga sprawa, czy ten mój pierwszy kod co dałem spełnia do konca swoje zadanie?, mysle że nie.

0

Zastanowiłbym się też nad jakimś lepszym algorytmem, niż naiwne "brute force".

0

Strasznie przekombinowane:

def sum_of_two(lst, _sum):
    comb = combinations(lst, 2)
    for c in comb:
        if sum(c) == _sum:
            print(f"{c} - znaleziono sumę liczb, która wynosi {_sum}")
        else:
            print(f"{c} - jest różna")

sum_of_two([1, 3, 5, 2, 11, 7], 9)
0
lion137 napisał(a):

Zastanowiłbym się też nad jakimś lepszym algorytmem, niż naiwne "brute force".

Do takich rzeczy chyba nawet by można użyć algorytmów genetycznych ;)

0

@Pyxis: Dzięki , o to mi własnie chodziło...., szkoda ze sam nie wpadłem jak ten kod rozgryzc :(. Cóż , jeszcze dużo nauki zostało przede mną. Byle się nie zniechęcać powodzeniami :) Pozdrawiam

P.S Ciekawe czy innym sposobem można to rozwiązać.... , będę miał czas pokombinuję , żeby kod był wydajniejszy , czytelniejszy (o ile się da :))

0
pythonowiec74 napisał(a):

P.S Ciekawe czy innym sposobem można to rozwiązać.... , będę miał czas pokombinuję , żeby kod był wydajniejszy , czytelniejszy (o ile się da :))

Tak, można skorzystać z tego, że słownik w Pythonie to hash mapa. Można zjechać z O(n^2) na O(n) czymś mniej więcej takim:

def sum_of_two_better(lst, _sum): 
    d = {v:i for i,v in enumerate(lst)} 
     
    for i in range(len(lst)): 
        rest = _sum - lst[i] 
        if rest in d:
            print(f"{lst[i]} + {lst[d[rest]]} = {_sum}")
0
def suma(lst, result):
	for x in lst[:]:
		lst.remove(x)
		for y in lst[:]:
			if x + y == result:
				print("{} + {} = {}".format(x,y,result))

suma([1, 3, 5, 2, 11, 7], 9)

1 użytkowników online, w tym zalogowanych: 0, gości: 1