X-Git-Url: https://wannabe.guru.org/gitweb/?a=blobdiff_plain;f=string_utils.py;h=aca4a5e3bfd9f49efa9a329b06addd9af5ffaa0a;hb=c63d439fb7e1d6f50e849b580f8bc6cfe88a81b6;hp=9a38d25c49cccddceec4da06ee8bbfe8133749aa;hpb=d08bad64a6884f25d28a2c38c6cd1c87b4335188;p=python_utils.git diff --git a/string_utils.py b/string_utils.py index 9a38d25..aca4a5e 100644 --- a/string_utils.py +++ b/string_utils.py @@ -1503,12 +1503,16 @@ def from_bitstring(bits: str, encoding='utf-8', errors='surrogatepass') -> str: return n.to_bytes((n.bit_length() + 7) // 8, 'big').decode(encoding, errors) or '\0' -def ip_v4_sort_key(txt: str) -> str: +def ip_v4_sort_key(txt: str) -> Tuple[int]: """Turn an IPv4 address into a tuple for sorting purposes. >>> ip_v4_sort_key('10.0.0.18') (10, 0, 0, 18) + >>> ips = ['10.0.0.10', '100.0.0.1', '1.2.3.4', '10.0.0.9'] + >>> sorted(ips, key=lambda x: ip_v4_sort_key(x)) + ['1.2.3.4', '10.0.0.9', '10.0.0.10', '100.0.0.1'] + """ if not is_ip_v4(txt): print(f"not IP: {txt}") @@ -1516,6 +1520,21 @@ def ip_v4_sort_key(txt: str) -> str: return tuple([int(x) for x in txt.split('.')]) +def path_ancestors_before_descendants_sort_key(volume: str) -> Tuple[str]: + """Chunk up a file path so that parent/ancestor paths sort before + children/descendant paths. + + >>> path_ancestors_before_descendants_sort_key('/usr/local/bin') + ('usr', 'local', 'bin') + + >>> paths = ['/usr/local', '/usr/local/bin', '/usr'] + >>> sorted(paths, key=lambda x: path_ancestors_before_descendants_sort_key(x)) + ['/usr', '/usr/local', '/usr/local/bin'] + + """ + return tuple([x for x in volume.split('/') if len(x) > 0]) + + if __name__ == '__main__': import doctest doctest.testmod()