| 1234567891011121314151617181920 |
- """Natural (numeric-aware) string sorting, e.g. "Drybox 2" before "Drybox 10"."""
- import re
- _CHUNK_RE = re.compile(r"(\d+)")
- def natural_sort_key(value: str) -> tuple:
- """Sort key that orders embedded numbers by value, not lexicographically.
- A plain string sort puts "Drybox 10" before "Drybox 2" (character by
- character, "1" < "2"). Splitting into alternating text/digit runs and
- comparing the digit runs as integers instead gets "Drybox 2" before
- "Drybox 10", without assuming every name follows a fixed "prefix N"
- shape. `_CHUNK_RE.split` always yields text chunks at even indices and
- digit chunks at odd indices for any input, so the type at a given index
- is consistent across every key this function produces — two keys can be
- compared without ever hitting a str-vs-int mismatch mid-tuple.
- """
- return tuple(int(chunk) if chunk.isdigit() else chunk.lower() for chunk in _CHUNK_RE.split(value))
|