Index: commit-queue/natsort.py |
=================================================================== |
--- commit-queue/natsort.py (revision 249146) |
+++ commit-queue/natsort.py (working copy) |
@@ -1,79 +0,0 @@ |
-#!/usr/bin/env python |
-# Copyright (c) 2011 The Chromium Authors. All rights reserved. |
-# Use of this source code is governed by a BSD-style license that can be |
-# found in the LICENSE file. |
-"""Intelligent natural sort implementation.""" |
- |
-import re |
- |
- |
-def natcmp(a, b): |
- """Natural string comparison, case sensitive.""" |
- try_int = lambda s: int(s) if s.isdigit() else s |
- def natsort_key(s): |
- if not isinstance(s, basestring): |
- # Since re.findall() generates a list out of a string, returns a list here |
- # to balance the comparison done in cmp(). |
- return [s] |
- return map(try_int, re.findall(r'(\d+|\D+)', s)) |
- return cmp(natsort_key(a), natsort_key(b)) |
- |
- |
-def try_lower(x): |
- """Opportunistically lower() a string if it is a string.""" |
- return x.lower() if hasattr(x, 'lower') else x |
- |
- |
-def naticasecmp(a, b): |
- """Natural string comparison, ignores case.""" |
- return natcmp(try_lower(a), try_lower(b)) |
- |
- |
-def natsort(seq, cmp=natcmp, *args, **kwargs): # pylint: disable=W0622 |
- """In-place natural string sort. |
- >>> a = ['3A2', '3a1'] |
- >>> natsort(a, key=try_lower) |
- >>> a |
- ['3a1', '3A2'] |
- >>> a = ['3a2', '3A1'] |
- >>> natsort(a, key=try_lower) |
- >>> a |
- ['3A1', '3a2'] |
- >>> a = ['3A2', '3a1'] |
- >>> natsort(a, cmp=naticasecmp) |
- >>> a |
- ['3a1', '3A2'] |
- >>> a = ['3a2', '3A1'] |
- >>> natsort(a, cmp=naticasecmp) |
- >>> a |
- ['3A1', '3a2'] |
- """ |
- seq.sort(cmp=cmp, *args, **kwargs) |
- |
- |
-def natsorted(seq, cmp=natcmp, *args, **kwargs): # pylint: disable=W0622 |
- """Returns a copy of seq, sorted by natural string sort. |
- |
- >>> natsorted(i for i in [4, '3a', '2', 1]) |
- [1, '2', '3a', 4] |
- >>> natsorted(['a4', 'a30']) |
- ['a4', 'a30'] |
- >>> natsorted(['3A2', '3a1'], key=try_lower) |
- ['3a1', '3A2'] |
- >>> natsorted(['3a2', '3A1'], key=try_lower) |
- ['3A1', '3a2'] |
- >>> natsorted(['3A2', '3a1'], cmp=naticasecmp) |
- ['3a1', '3A2'] |
- >>> natsorted(['3a2', '3A1'], cmp=naticasecmp) |
- ['3A1', '3a2'] |
- >>> natsorted(['3A2', '3a1']) |
- ['3A2', '3a1'] |
- >>> natsorted(['3a2', '3A1']) |
- ['3A1', '3a2'] |
- """ |
- return sorted(seq, cmp=cmp, *args, **kwargs) |
- |
- |
-if __name__ == '__main__': |
- import doctest |
- doctest.testmod() |