Shape Rule
Diamond halves
Top half grows 1..rows; bottom half mirrors rows-1..1.

The centered number diamond prints 1, 123, 12345, … 123456789, then mirrors back down — a natural follow-up after Program 43’s right-aligned triangle. This tutorial covers two outer loops, centering spaces, ascending digit sequences, a live preview, worked Python examples, edge cases, and complexity.
Diamond halves
Top half grows 1..rows; bottom half mirrors rows-1..1.
i = 1..rows
for i in range(1, rows + 1): — builds the growing half of the diamond.
i = rows-1..1
for i in range(rows - 1, 0, -1): — mirrors the top half back down.
Center rows
Leading spaces then range(1, 2*i) prints 1 to 2*i-1.
Rows 3–5
Pick a height and draw the centered number diamond in the browser.
Complexity
Each level prints O(n) digits across O(n) levels — total work scales as n².
A diamond number pyramid prints odd-length digit rows: 1, 123, 12345, … up to the widest row, then mirrors back down. With rows = 5, the output is a symmetric centered diamond.
In Python you use two outer loops: the first grows rows 1..rows; the second shrinks rows-1..1. Each row prints leading spaces, then digits 1 to 2*i-1 with print(k, end="").
It combines two-phase loops with centering — a key step after Program 43’s right-aligned triangle.
Odd-length rows.
Top + bottom loops.
rows - i spaces.
Follow Program 43; continue to Program 45 next.
In short: top loop i = 1..rows, bottom loop i = rows-1..1, spaces rows - i, digits range(1, 2*i), then print().
Given rows = 5, print a centered number diamond: top half grows odd-length digit rows; bottom half mirrors back down.
# rows = 5
# 1
# 123
# 12345
# 1234567
#123456789
# 1234567
# 12345
# 123
# 1 | Item | Type | Description |
|---|---|---|
rows | int | Half-height of the diamond — widest row has 2*rows-1 digits. |
i | int | Outer loop — row index (top: 1..rows; bottom: rows-1..1). |
k | int | Number loop — prints digits 1..2*i-1. |
for i from 1 to rows:
print (rows - i) spaces
for k from 1 to 2*i-1: print k
print newline
for i from rows-1 down to 1:
print (rows - i) spaces
for k from 1 to 2*i-1: print k
print newline | Approach | Idea | Best for |
|---|---|---|
| Fixed rows | 1, 123, … | Learning and interviews |
| User-input rows | int(input(...)) | Configurable diamond size |
| Compact demo | rows = 3 | Paper trace before scaling up |
| Goal | Pattern |
|---|---|
| Top outer loop | for i in range(1, rows + 1): |
| Bottom outer loop | for i in range(rows - 1, 0, -1): |
| Leading spaces | print(" " * (rows - i), end="") |
| Number loop | for k in range(1, 2 * i): |
| Print digit | print(k, end="") |
| End the row | print() |
| Program 43 contrast | Right-aligned triangle — not a centered diamond |
Same centered number diamond — different ways to control height and trace the loops.
i = 1..rowsGrowing half
i = rows-1..1Mirrored half
range(1, 2*i)Odd-length rows
rows = 3Quick paper trace
Reach for this pattern when teaching two-phase loops, odd-length sequences, and centered console output.
Natural follow-up — moves from a right-aligned triangle to a symmetric centered diamond with two outer loops.
Practice separating top and bottom halves before tackling hollow or alphabet diamonds.
Combine loops with input() for flexible row counts.
Compare Program 43 (right-aligned triangle) and Program 45 (next in series) next.
This is a console teaching pattern — not how you build modern app screens.
Key benefit: one small program that locks in two-phase loops, centering spaces, and O(n²) thinking.
Choose a height between 3 and 5 and draw the centered number diamond in the browser.
Three complete Python programs — fixed rows, user input, and compact demo. Click View Output to reveal sample console results.
Print a centered diamond with rows = 5 using space loops and ascending digit sequences.
rows = 5Hard-coded row count — ideal for first demos and screenshots.
rows = 5
# top half (1, 123, 12345, ...)
for i in range(1, rows + 1):
print(" " * (rows - i), end="")
for k in range(1, 2 * i):
print(k, end="")
print()
# bottom half (..., 12345, 123, 1)
for i in range(rows - 1, 0, -1):
print(" " * (rows - i), end="")
for k in range(1, 2 * i):
print(k, end="")
print() When i = 1, four spaces center a single 1. When i = 3, two spaces precede 12345. The bottom half mirrors from i = 4 down to 1.
Read the row count with input() instead of hard-coding 5.
Read rows with input() and validate rows > 0.
rows = int(input("Enter the number of rows: "))
if rows < 1:
raise ValueError("rows must be at least 1")
for i in range(1, rows + 1):
print(" " * (rows - i), end="")
for k in range(1, 2 * i):
print(k, end="")
print()
for i in range(rows - 1, 0, -1):
print(" " * (rows - i), end="")
for k in range(1, 2 * i):
print(k, end="")
print() Same space-and-number loop core as Example 1; only rows comes from user input instead of being hard-coded as 5.
Run with rows = 3 to trace every row on paper before scaling up.
rows = 3Same space and number loops with a smaller row count for quick tracing.
rows = 3
for i in range(1, rows + 1):
print(" " * (rows - i), end="")
for k in range(1, 2 * i):
print(k, end="")
print()
for i in range(rows - 1, 0, -1):
print(" " * (rows - i), end="")
for k in range(1, 2 * i):
print(k, end="")
print() Only rows changes from 5 to 3 — the space and number loops stay identical. Trace i = 1, 2, 3 on paper to see how row length grows as 2*i-1.
No imports needed. Set rows = 5 and loop variables i, k.
for i in range(1, rows + 1): — builds the growing half of the diamond.
print(" " * (rows - i), end="") — centers each row before digits.
for k in range(1, 2 * i): then print(k, end="") — odd-length digit row.
for i in range(rows - 1, 0, -1): — mirrors the top half back down.
Total printed digits grow with diamond area — O(n²) time, O(1) extra memory.
rows = 5, row i = 3Trace row 3 on the top half — spaces, digits printed, and full row output.
| Step | Detail | Output so far |
|---|---|---|
| Spaces | rows - i = 2 spaces | |
k = 1..5 | Prints 12345 | 12345 |
print() | End row 3 | 12345 |
Characters per row = 2*i-1. Space count on top half = rows - i. Bottom half repeats rows 4, 3, 2, 1 in reverse.
Where this tiny pattern (and its loop structure) shows up beyond the homework prompt.
Clearest visual proof that outer and inner bounds interact.
Example: skip the space loop and watch the diamond snap left.
Foundation for inverted, pyramid, diamond, and hollow variants.
Example: continue to Program 45 for the next pattern in the series.
Practice print(..., end="") vs print() without complex math.
Example: put print() inside the inner loop by mistake.
Add spaces between digits once the two-loop structure works.
Example: use print(k, end=" ") between digits for wider spacing.
Diamond totals make O(n²) concrete for beginners.
Example: count printed digits for rows = 5 — top half alone prints 25 digits.
Pair the pattern with input() checks and positive-row checks.
Example: reject rows <= 0 and re-prompt.
Pro Tip: when an interviewer asks for patterns, explain the outer/inner roles first — then write the loops. The story matters as much as the code.
Why this pattern earns a permanent spot in beginner Python courses.
Wrong bounds show up immediately as a broken staircase.
Only loops and console output — no arrays or math libraries.
Invert, center, hollow, or change the fill character with small edits.
Streaming output needs no storage beyond loop counters.
Pro Tip: trace i, space count, and digit loop on paper for rows = 3 before coding — watch how row length grows as 2*i-1.
Small habits that keep number-pattern code clean.
Top half 1..rows and bottom half rows-1..1 — do not repeat the peak row.
try/except ValueErrorUse try/except ValueError so bad input does not crash when converting rows.
Only call print() after the inner loop finishes the row.
Mark rows - i spaces before each row’s digits before coding.
Trace i = 1..3 on paper before coding the full rows = 5 demo.
Pro Tip: if the output is a vertical list of single digits per line, you almost certainly put print() inside the inner loop.
Mistakes that commonly break centered number diamond patterns.
Each digit lands on its own line — you get a column, not a diamond.
→ Use print(k, end=""); print() only after the number loop.
Without leading spaces, the diamond loses its centered shape.
→ Run the space loop before the number loop on every row.
range(1, 2 * i + 1) adds an extra digit — row length becomes even instead of odd.
→ Keep for k in range(1, 2 * i): for exactly 2*i-1 digits.
Starting the bottom loop at i = rows prints the widest row twice.
→ Bottom half starts at i = rows - 1, not rows.
int(input())Letters or empty input raise ValueError with bare int(input()).
→ Catch ValueError and re-prompt on failure.
Check these inputs before calling the solution done.
Output is just 1 — one row, no bottom half needed.
Outer loop never runs — print nothing or show a message.
rows < 1Treat as invalid; re-prompt instead of silent empty output.
Three rows: 1, 123, 1.
Bare int(input()) raises ValueError on bad input — use try/except first.
Total lines = 2*rows - 1 — grows quadratically with peak height.
Try these variations to lock in the pattern.
rows - ii = 1..rows without the mirrork from 2*i-1 down to 1i = 1..rows, space loop then k = 1..2*i-1. Bottom starts at rows - 1.print(..., end="") stays on the line; print() advances — mix them carefully.rows > 0 for interactive programs; rows = 1 prints a single centered 1.rows - 1 — do not repeat the peak row at i = rows.Quick Takeaway: top loop i = 1..rows, space loop then digits k = 1..2*i-1, bottom i = rows-1..1, then print().
| Program | Time | Extra space |
|---|---|---|
| Nested loops (Examples 1–3) | O(n²) | O(1) |
| Smaller demo (Example 3) | O(n²) | O(1) |
The centered number diamond is a compact lesson in symmetric patterns and centering spaces: print leading spaces, print digits 1 to 2*i-1, grow rows in the top half, then mirror back down. Master the fixed-rows version, then try user input and a smaller trace demo.
Practice the three examples above, then continue to Program 45 for the next pattern in the series.
Bottom half must start at rows - 1 — validate rows when reading from the console.
for i in range(1, rows + 1):for i in range(rows - 1, 0, -1):print(k, end="") for k = 1..2*i-1int(input()) in try/except ValueErrorprint() inside the inner loopi = rows (repeats peak row)range(1, 2 * i + 1) instead of range(1, 2 * i)rows = 1 edge casePrint the pattern the beginner-friendly way.
Digits per row
DefinitionTop + mirror
Code2*i-1 digits
Codei = rows-1
ShapeO(n²) time
AnalysisThis pattern prints a top half (1..rows) and a bottom half (rows-1..1). Each row prints 2*i-1 digits (1 to 2*i-1) with leading spaces to center the diamond.
Move on to the next pattern in the Python number-pattern series.
12 people found this page helpful