Welcome, guest | Sign In | My Account | Store | Cart
"""Provides functionality for taking in an iterable that returns names and then
separates them by last name initial and sorts them."""

import itertools

def groupnames(name_iterable):
    """Return a dict keyed by last name initial with a value of a tuple of the
    names sorted by last first name.

    The items returned by name_iterable are expected to be strings containing
    the names formatted as ``first middle last`` with middle being optional.

    >>> groupnames(('Anna Martelli', 'Alex Martelli', 'Todd Cannon', 'Gwen C',
    ... 'John Doe'))
    {'C': ('Gwen C', 'Todd Cannon'), 'M': ('Alex Martelli', 'Anna Martelli'), 'D': ('John Doe',)}

    """
    sorted_names = sorted(name_iterable, key=sortkeyfunc)
    name_dict = {}
    for key, group in itertools.groupby(sorted_names, groupkeyfunc):
        name_dict[key] = tuple(group)
    return name_dict

def sortkeyfunc(name):
    """Return name in last-first-middle order"""
    name_parts = name.split()
    new_name = ' '.join((name_parts[-1], name_parts[0]))
    if len(name_parts) == 3:
        new_name = ' '.join((new_name, name_parts[1]))
    return new_name

def groupkeyfunc(name):
    """Return the last name initial"""
    return name.split()[-1][0]

if __name__ == '__main__':
    import doctest
    doctest.testmod()

History