Find the minimum, maximum, and the index of the maximum in a single pass over a 6-element list. Two if-checks per iteration update the running extremes. The trace shows min_val, max_val, and max_idx updating only when a new extreme is found.

By hand

Initialize min_val, max_val, and max_idx from the first element. Loop over each index i: if values[i] is smaller than min_val, update it; if larger than max_val, update both max_val and max_idx.

naive.py
Replay: real traced execution (multi-file project)
values = [3, 7, 2, 9, 1, 5]
min_val = values[0]
max_val = values[0]
max_idx = 0
for i in range(len(values)):
    if values[i] < min_val:
        min_val = values[i]
    if values[i] > max_val:
        max_val = values[i]
        max_idx = i
print('RESULT:', (min_val, max_val, max_idx))
  1. values ← [3, 7, 2, 9, 1, 5]

    1values = [3, 7, 2, 9, 1, 5]2min_val = values[0]
    values this step[3, 7, 2, 9, 1, 5]values
  2. min_val ← 3

    1values = [3, 7, 2, 9, 1, 5]2min_val = values[0]3max_val = values[0]
    values this step3min_val
  3. max_val ← 3

    2min_val = values[0]3max_val = values[0]4max_idx = 0
    values this step3max_val
  4. max_idx ← 0

    3max_val = values[0]4max_idx = 05for i in range(len(values)):
    values this step0max_idx
  5. i ← 0

    4max_idx = 05for i in range(len(values)):6    if values[i] < min_val:
    values this step0i
  6. if values[i] < min_val:

    5for i in range(len(values)):6    if values[i] < min_val:7        min_val = values[i]
  7. if values[i] > max_val:

    7    min_val = values[i]8if values[i] > max_val:9    max_val = values[i]
  8. i ← 1

    4max_idx = 05for i in range(len(values)):6    if values[i] < min_val:
    values this step0 1i
  9. if values[i] < min_val:

    5for i in range(len(values)):6    if values[i] < min_val:7        min_val = values[i]
  10. if values[i] > max_val:

    7    min_val = values[i]8if values[i] > max_val:9    max_val = values[i]
  11. max_val ← 7

    8if values[i] > max_val:9    max_val = values[i]10    max_idx = i
    values this step3 7max_val
  12. max_idx ← 1

    9        max_val = values[i]10        max_idx = i11print('RESULT:', (min_val, max_val, max_idx))
    values this step0 1max_idx
  13. i ← 2

    4max_idx = 05for i in range(len(values)):6    if values[i] < min_val:
    values this step1 2i
  14. if values[i] < min_val:

    5for i in range(len(values)):6    if values[i] < min_val:7        min_val = values[i]
  15. min_val ← 2

    6if values[i] < min_val:7    min_val = values[i]8if values[i] > max_val:
    values this step3 2min_val
  16. if values[i] > max_val:

    7    min_val = values[i]8if values[i] > max_val:9    max_val = values[i]
  17. i ← 3

    4max_idx = 05for i in range(len(values)):6    if values[i] < min_val:
    values this step2 3i
  18. if values[i] < min_val:

    5for i in range(len(values)):6    if values[i] < min_val:7        min_val = values[i]
  19. if values[i] > max_val:

    7    min_val = values[i]8if values[i] > max_val:9    max_val = values[i]
  20. max_val ← 9

    8if values[i] > max_val:9    max_val = values[i]10    max_idx = i
    values this step7 9max_val
  21. max_idx ← 3

    9        max_val = values[i]10        max_idx = i11print('RESULT:', (min_val, max_val, max_idx))
    values this step1 3max_idx
  22. i ← 4

    4max_idx = 05for i in range(len(values)):6    if values[i] < min_val:
    values this step3 4i
  23. if values[i] < min_val:

    5for i in range(len(values)):6    if values[i] < min_val:7        min_val = values[i]
  24. min_val ← 1

    6if values[i] < min_val:7    min_val = values[i]8if values[i] > max_val:
    values this step2 1min_val
  25. if values[i] > max_val:

    7    min_val = values[i]8if values[i] > max_val:9    max_val = values[i]
  26. i ← 5

    4max_idx = 05for i in range(len(values)):6    if values[i] < min_val:
    values this step4 5i
  27. if values[i] < min_val:

    5for i in range(len(values)):6    if values[i] < min_val:7        min_val = values[i]
  28. if values[i] > max_val:

    7    min_val = values[i]8if values[i] > max_val:9    max_val = values[i]
  29. for i in range(len(values)):

    4max_idx = 05for i in range(len(values)):6    if values[i] < min_val:
  30. stdout ← RESULT: (1, 9, 3)

    10        max_idx = i11print('RESULT:', (min_val, max_val, max_idx))
    values this stepRESULT: (1, 9, 3)stdout

With NumPy

a.min() and a.max() return the extreme values; a.argmax() returns the integer index of the first occurrence of the maximum. The snapshot shows the input array followed by all three results on one line.

library.py
import numpy as np

values = [3, 7, 2, 9, 1, 5]
a = np.array(values)
mn = int(a.min())
mx = int(a.max())
idx = int(a.argmax())
print('shape:', a.shape)
print('dtype:', a.dtype)
print('values:', a.tolist())
print('min:', mn, 'max:', mx, 'argmax:', idx)
print('RESULT:', (mn, mx, idx))
shape: (6,)
dtype: int64
values: [3, 7, 2, 9, 1, 5]
min: 1 max: 9 argmax: 3
RESULT: (1, 9, 3)

Implementation notes

  • argmax returns the index of the first maximum. If the maximum value appears more than once, argmax returns the lowest index — the same behaviour as the hand-written loop here, which only updates max_idx on a strict > comparison.
  • a.argmin() works the same way for the minimum.
  • All three — min, max, argmax — are reductions: they collapse the array to a scalar (or an index). Called without an axis argument they operate over the entire array.
  • int() converts the NumPy scalar return values to plain Python ints for RESULT, avoiding repr differences across NumPy versions.
  • Shape, dtype, and values are shown explicitly here because ndarray.__repr__ output varies with NumPy version and print options.