1
0
mirror of https://github.com/jbranchaud/til synced 2026-07-02 23:58:25 +00:00

Add Sort Normalized Version Of Data as a Python TIL

This commit is contained in:
jbranchaud
2026-04-29 11:34:32 -05:00
parent cd54360925
commit ab8331000f
2 changed files with 35 additions and 1 deletions
+2 -1
View File
@@ -10,7 +10,7 @@ working across different projects via [VisualMode](https://www.visualmode.dev/).
For a steady stream of TILs, [sign up for my newsletter](https://visualmode.kit.com/newsletter). For a steady stream of TILs, [sign up for my newsletter](https://visualmode.kit.com/newsletter).
_1779 TILs and counting..._ _1780 TILs and counting..._
See some of the other learning resources I work on: See some of the other learning resources I work on:
@@ -1070,6 +1070,7 @@ If you've learned something here, support my efforts writing daily TILs by
- [Parse Relative Time To datetime Object](python/parse-relative-time-to-datetime-object.md) - [Parse Relative Time To datetime Object](python/parse-relative-time-to-datetime-object.md)
- [Skip Specific Pytest Test Cases](python/skip-specific-pytest-test-cases.md) - [Skip Specific Pytest Test Cases](python/skip-specific-pytest-test-cases.md)
- [Sort A List Of Dataclass Instances](python/sort-a-list-of-dataclass-instances.md) - [Sort A List Of Dataclass Instances](python/sort-a-list-of-dataclass-instances.md)
- [Sort Normalized Version Of Data](python/sort-normalized-version-of-data.md)
- [Start The Debugger When A Test Errors](python/start-the-debugger-when-a-test-errors.md) - [Start The Debugger When A Test Errors](python/start-the-debugger-when-a-test-errors.md)
- [Store And Access Immutable Data In A Tuple](python/store-and-access-immutable-data-in-a-tuple.md) - [Store And Access Immutable Data In A Tuple](python/store-and-access-immutable-data-in-a-tuple.md)
- [Test A Function With Pytest](python/test-a-function-with-pytest.md) - [Test A Function With Pytest](python/test-a-function-with-pytest.md)
+33
View File
@@ -0,0 +1,33 @@
# Sort Normalized Version Of Data
Let's say I have a list of names that I want to sort. However, because of
inconsistency in how the data was entered, sometimes those names are capitalized
and other times they are not. Using
[`methodcaller`](https://docs.python.org/3/library/operator.html#operator.methodcaller),
I can normalize the sorting `key` used when comparing list items.
First, let's look at calling `sorted` with the list and no `key`:
```python
>>> sorted(["butler", "Jemisin", "le guin", "Erdrich"])
['Erdrich', 'Jemisin', 'butler', 'le guin']
```
`butler` which starts with a `b` gets moved to the 3rd position because it is
lowercase.
To sort this list using a normalized comparison, we will use `methodcaller` to
create a callable out of `lower` which is then passed as the sort `key`:
```python
>>> from operator import methodcaller
>>> sorted(["butler", "Jemisin", "le guin", "Erdrich"], key=methodcaller("lower"))
['butler', 'Erdrich', 'Jemisin', 'le guin']
```
That's the sort order I was originally hoping for.
What `methodcaller` is doing is creating a callable function that will invoke
`lower` with each string instance as the target. Conceptually similar to
`"Erdrich".lower()` or even `getattr("Erdrich", "lower")()` (notice this needs
to be immediately invoked).