Is there a more elegant way of finding minimum in array in this case?

Question:

What needs to be done in this task:

Determine the amount of couples of neighbouring elements in which both of the numbers are multiple of 7 and also determine a minimal sum of the elements of such couples.

In the actual task I need to read a file, but here I put elements in the list by myself.

a = [7, 14, 2, 6, 5, 7, 7]

counter = 0
minSum = 1000000000000000000000 # This is what this question is all about
for i in range(len(a)):
    if a[i] % 7 == 0 and a[i + 1] % 7 == 0:
        counter += 1
        if (a[i] + a[i + 1]) < minSum:
            minSum = a[i] + a[i + 1]

print(counter, minSum)

So my question is basically this: is there a more elegant way of searching a minimal sum of elements, I mean without setting a giant number to the variable?

Asked By: Coder4Fun250

||

Answers:

Use float('inf'), which will always compare larger to any other number (except float('inf') and float('nan'), of course).

So:

minSum = float('inf')
Answered By: juanpa.arrivillaga

It is far more elegant to use the built-in function min to search for a minimum.

min_sum = min(
    x + y
    for (x, y) in zip(a, a[1:])
    if x % 7 == 0 and y % 7 == 0 
)
Answered By: kaya3

Use itertools.pairwise to iterate through successive pairs of values and then find the minimum of valid candidates:

>>> import itertools
>>> min(sum(p) for p in pairwise(a) if p[0] % 7 == 0 and p[1] % 7 == 0)
14
Answered By: Woodford

You could use None as a sentinel:

counter = 0
minSum = None
for i in range(len(a)-1):
    if a[i] % 7 == 0 and a[i+1] % 7 == 0:
        counter += 1
        t = a[i] + a[i+1]
        if minSum is None or t < minSum:
            minSum = t

(By the way, range(len(a)) should be range(len(a)-1), which I’ve fixed here.)

Answered By: wjandrea
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.