diff --git a/data-extra.cabal b/data-extra.cabal
--- a/data-extra.cabal
+++ b/data-extra.cabal
@@ -1,5 +1,5 @@
 name:                data-extra
-version:             2.5.3
+version:             2.5.4
 synopsis:            Extra utilities for working on Data.* types.
 description:         Extra utilities for working on Data.* types.
 license:             BSD3
diff --git a/src/Data/List/Extra.hs b/src/Data/List/Extra.hs
--- a/src/Data/List/Extra.hs
+++ b/src/Data/List/Extra.hs
@@ -2,9 +2,11 @@
 
 module Data.List.Extra where
 
+import Control.Arrow
 import Data.Bool.Extra
 import Data.List
 import Data.Maybe
+import Data.Ord
 
 -- | When a list is non-null, pass it to a function, otherwise use the
 -- default.
@@ -33,3 +35,8 @@
 maxList :: (Num t, Ord t) => [t] -> t
 maxList [] = 0
 maxList xs = maximum xs
+
+-- | Sort a list using a key on each element.  This implements the
+--   decorate-sort-undecorate paradigm, also called a Schwarzian transform.
+sortByKey :: Ord b => (a -> b) -> [a] -> [a]
+sortByKey f = map snd . sortBy (comparing fst) . map (f &&& id)
