[].keys() and [].items() (Was: Why I think range is a wart)

Tim Hochberg tim.hochberg at ieee.org
Thu Mar 14 22:03:12 EST 2002


James_Althoff wrote:
> Here's a q&d sample implementation in case anyone wants to test out the
> idea before deciding on its merits.
[Implementation of keys, iterkeys, values, itervalues, etc. for a list
object]

FWIW, here's the corresponding implementation in terms of generic functions
instead of methods, an approach I like better than the method approach.

# itertools.py
"""
Tools for working with iterables.

Note: several of these functions assumes that if an object has a
'keys' method, it will also have an 'iterkeys' method and they will be
consistent.

Contents:

* keys(I) / iterkeys(I) -> list / iterator for I's keys

>>> list(iterkeys('abcd'))
[0, 1, 2, 3]
>>> _sorted(iterkeys({'fee' : 'one', 'fie' : 'two', 'foe' : 'three', 'fum' :
'four'}))
['fee', 'fie', 'foe', 'fum']

* values(I) / itervalues(I) -> return a list / iterator for I's values

>>> list(itervalues('abcd'))
['a', 'b', 'c', 'd']
>>> _sorted(itervalues({'fee' : 'one', 'fie' : 'two', 'foe' : 'three', 'fum'
: 'four'}))
['four', 'one', 'three', 'two']

* items(I) / iteritems(I) -> list / iterator for I's items [(key, value)
pairs]

>>> list(iteritems('abcd'))
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]
>>> _sorted(iteritems({'fee' : 'one', 'fie' : 'two', 'foe' : 'three', 'fum'
: 'four'}))
[('fee', 'one'), ('fie', 'two'), ('foe', 'three'), ('fum', 'four')]

* iterzip(I1, [I2, [...]]) -> lazy version of zip.

>>> list(iterzip('abcdef', [1,2,3,4], ('cold', 'warm', 'hot')))
[('a', 1, 'cold'), ('b', 2, 'warm'), ('c', 3, 'hot')]


"""
from __future__ import generators

def _sorted(iterable):
    l = list(iterable)
    l.sort()
    return l

def iterkeys(iterable):
    """iterkeys(I) -> iterator for I's keys"""
    if hasattr(iterable, 'iterkeys'):
        for k in iterable.iterkeys():
            yield k
    else:
        k = 0
        for v in iterable:
            yield k
            k += 1

def keys(iterable):
    """keys(I) -> list of I's keys"""
    return list(iterkeys(iterable))

def itervalues(iterable):
    """itervalues(I) -> iterator for I's values"""
    if hasattr(iterable, 'itervalues'):
        for v in iterable.itervalues():
            yield v
    else:
        for v in iterable:
            yield v

def values(iterable):
    """values(I) -> list of I's values"""
    return list(itervalues(iterable))

def iteritems(iterable):
    """iteritems(I) -> iterator for I's items [(key, value) pairs]"""

    if hasattr(iterable, 'iteritems'):
        for i in iterable.iteritems():
            yield i
    else:
        k = 0
        for v in iterable:
            yield k, v
            k += 1

def items(iterable):
    """items(I) -> list of I's items [(key, value) pairs]"""
    return list(iteritems(iterable))

def iterzip(*args):
    """iterzip(I1 [, I2 [...]]) -> (I1[0], I2[0] ...), ...

    Return an iterator yielding tuples, where each tuple contains the
    i-th element from each of the argument iterables.  The iterator returns
    as many tuples as are in the shortest argument sequence.
"""
    if not args:
        raise TypeError("iterzip requires at least one sequence")
    iters = [iter(a) for a in args]
    while 1:
        value = []
        for i in iters:
            value.append(i.next())
        yield tuple(value)






More information about the Python-list mailing list