Python Hollow Number Diamond Pattern

Beginner
5 min read
Updated: Sep 2026
3 programs
Live preview

What Is This Pattern?

A diagonal mirror number diamond is Program 57’s inverse-V pyramid plus a mirrored bottom half — digit i only on the left and right diagonals, spaces everywhere else.

Remember
Rule: top i = 1..rows, bottom i = rows−1..1
      same left/right diagonal print as Program 57

    1
   2 2
  3   3
 4     4
5       5
 4     4
  3   3
   2 2
    1     ← rows = 5 (9 lines)

In Python reuse the same diagonal row logic twice: climb 1..rows, then descend rows-1..1, then a bare print() after each row.

How to Solve It

Reuse Program 57’s diagonal row logic twice: climb 1..rows, then descend rows-1..1 so the peak line appears once.

MethodIdeaBest for
Two outer loopsTop 1..rows, bottom rows-1..1Learning, interviews, exams
Rows inputSame logic with a user-chosen half-heightPractice / demos

Pseudocode

Pseudocode
function print_row(i, rows):
    for j from rows down to 1:
        if i == j: print i else print space
    for k from 2 to rows:
        if i == k: print i else print space
    print newline

for i from 1 to rows:
    print_row(i, rows)
for i from rows - 1 down to 1:
    print_row(i, rows)

Cheat sheet

GoalPattern
Top halffor i in range(1, rows + 1):
Bottom halffor i in range(rows - 1, 0, -1):
Left diagonalfor j in range(rows, 0, -1): print(j if i == j else " ", end="")
Right diagonalfor k in range(2, rows + 1): print(k if i == k else " ", end="")
Total lines2 * rows - 1

Printing Numbers vs Starting a New Line

APIEffectUse for
print(..., end="")Stays on the same lineEach diagonal digit or filler space
print()Ends the current lineAfter both left and right loops

Columns use end=""; a bare print() ends the row once.

Live Preview

Change the half-height and the hollow diamond updates instantly — capped at 9 for readable single-digit demos.

Whole numbers from 1 to 9. Tap a chip or type a value — the preview redraws as you go.

Live result rows = 5 · 9 lines
    1    
   2 2   
  3   3  
 4     4 
5       5
 4     4 
  3   3  
   2 2   
    1    

Worked Walkthrough — rows = 5

See how the two outer loops share one row body and why the bottom starts at rows - 1.

Halfi valuesLines produced
Top1..51 → 2 2 → … → 5
Bottom4..14 → 3 3 → … → 1

Total lines = 2×5−1 = 9. Starting the bottom at 5 would print the peak twice.

Python Programs

Three complete programs: fixed rows = 5, user-input half-height, and a compact rows = 3 demo. Use View Output for sample results.

Example 1 — Fixed rows = 5

Hard-coded half-height — top pyramid, then mirrored bottom with the same diagonal logic.

Python
rows = 5

for i in range(1, rows + 1):
    for j in range(rows, 0, -1):
        print(j if i == j else " ", end="")

    for k in range(2, rows + 1):
        print(k if i == k else " ", end="")

    print()

for i in range(rows - 1, 0, -1):
    for j in range(rows, 0, -1):
        print(j if i == j else " ", end="")

    for k in range(2, rows + 1):
        print(k if i == k else " ", end="")

    print()

How It Works

1. Top half. Same as Program 57: left j = rows..1, right k = 2..rows.

2. Bottom half. Replay the same row body for i = rows - 1 down to 1.

3. One peak. Skipping i = rows on the way down keeps the middle line unique.

Example 2 — User Input (rows)

Read the half-height and draw the same hollow diagonal diamond.

Python
try:
    rows = int(input("Enter the number of rows: "))
except ValueError:
    print("Please enter a positive whole number.")
    raise SystemExit

if rows < 1:
    print("Please enter a positive whole number.")
    raise SystemExit

for i in range(1, rows + 1):
    for j in range(rows, 0, -1):
        print(j if i == j else " ", end="")

    for k in range(2, rows + 1):
        print(k if i == k else " ", end="")

    print()

for i in range(rows - 1, 0, -1):
    for j in range(rows, 0, -1):
        print(j if i == j else " ", end="")

    for k in range(2, rows + 1):
        print(k if i == k else " ", end="")

    print()

How It Works

1. Validate rows. Catch ValueError; require rows >= 1.

2. Same core. Top and bottom loops match Example 1 — only rows comes from the user.

3. Single-digit tip. Cap demos at rows ≤ 9 so every digit stays one character wide.

Example 3 — Compact rows = 3

Five-line diamond — easy to confirm the bottom starts at 2, not 3.

Python
rows = 3

for i in range(1, rows + 1):
    for j in range(rows, 0, -1):
        print(j if i == j else " ", end="")

    for k in range(2, rows + 1):
        print(k if i == k else " ", end="")

    print()

for i in range(rows - 1, 0, -1):
    for j in range(rows, 0, -1):
        print(j if i == j else " ", end="")

    for k in range(2, rows + 1):
        print(k if i == k else " ", end="")

    print()

How It Works

1. Five lines. Top prints 1, 2 2, 3 3; bottom reprints 2 2 and 1.

2. Trace on paper. Confirm the peak 3 3 appears once — bottom starts at rows - 1.

Edge Cases & Pitfalls

Check these before calling the solution done.

i = rows..1

Double peak

If the bottom loop starts at rows, the widest line prints twice. Always start at rows - 1.

k = 1

Triple digit on a row

If the right loop starts at 1, the center column can print a third digit. Keep k = 2.

bare print()

Broken rows

If bare print() sits inside an inner loop, each character lands on its own line. Call it only after both diagonal loops finish.

rows = 1

Single line

Output is just 1 — the bottom loop (rows-1..1) does not run.

rows > 9

Multi-digit width

Digits 10+ break neat column alignment. Cap demos at 9 or use a fixed field width.

Bad input

int(input()) throws

Wrap with try/except ValueError so non-numeric input does not crash the script.

Time and Space Complexity

ProgramTimeExtra space
Fixed / compact (Examples 1, 3)O(n²)O(1)
User input (Example 2)O(n²)O(1)

You print 2n−1 lines, each scanning about 2n−1 positions → O(n²) time. Only a few loop variables are needed.

Key Takeaways

  • Pyramid + mirror: top 1..rows, bottom rows-1..1, same diagonal row body.
  • Skip the peak twice: bottom starts at rows - 1.
  • print vs print(): digits and spaces use end=""; bare print() advances after both loops.
  • Next step: Program 59 prints consecutive numbers around a hollow square border.

One line: Program 57 once upward, then again from rows-1 down to 1.

Frequently Asked Questions

Each row prints the same digit on the left diagonal and the right diagonal; spaces fill the remaining positions.
The top half already printed the peak row — starting at rows-1 avoids duplicating the middle line.
An inverse-V pyramid from 1 to rows, then mirrored back down to 1 — 2*rows-1 lines total.
Program 57 prints only the top pyramid half. Program 58 adds a second outer loop from rows-1 down to 1 for the bottom half.
Each column prints either the row digit or a space — those conditions pick exactly the two diagonal positions.
Change rows or read it from user input with int(input()) inside try/except — see Example 2.
O(n²) for n rows because you print 2n-1 lines, each scanning about 2n positions.
Yes. Replace print(j, end="") / print(k, end="") with print("*", end="") in both diagonal print branches.
Use try/except ValueError around int(input()) so bad input does not crash the script.
Only one line prints — the bottom loop (rows-1..1) does not run.

Did you know?

Print the Program 57 pyramid for the top half, then mirror with for i in range(rows - 1, 0, -1). Total lines = 2×rows-1 — each row scans about 2×rows-1 positions.

Next: Hollow Square Border Numbers

Continue with consecutive numbers around a hollow square border.

Program 59 tutorial →

About the author

Mari Selvan M P
Mari Selvan M P 🔗

Developer, cloud engineer, and technical writer

  • Experience 12 years building web and cloud systems
  • Focus Full Stack Development, AWS, and Developer Education

I write practical tutorials so students and working developers can learn by doing—from databases and APIs to deployment on AWS.

6 people found this page helpful