Identifying the start of good data in a list

bearophileHUGS at lycos.com bearophileHUGS at lycos.com
Tue Aug 26 18:44:45 EDT 2008


First solutions I have found, not much tested beside the few doctests:

from itertools import islice

def start_good1(alist, good_ones=4):
    """
    Maybe more efficient for Python

    >>> start_good = start_good1
    >>> start_good([0, 0, 1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    4
    >>> start_good([])
    -1
    >>> start_good([0, 0])
    -1
    >>> start_good([0, 0, 0])
    -1
    >>> start_good([0, 0, 0, 0, 1])
    -1
    >>> start_good([0, 0, 1, 0, 1, 2, 3])
    -1
    >>> start_good([0, 0, 1, 0, 1, 2, 3, 4])
    4
    >>> start_good([0, 0, 1, 0, 1, 2, 3, 4, 5])
    4
    >>> start_good([1, 2, 3, 4])
    0
    >>> start_good([1, 2, 3])
    -1
    >>> start_good([0, 0, 1, 0, 1, 2, 0, 4])
    -1
    """
    for i in xrange(len(alist) - good_ones + 1):
        if all(islice(alist, i, i+good_ones)):
            return i
    return -1



def start_good2(alist, good_ones=4):
    """
    Maybe more efficient for Psyco

    >>> start_good = start_good2
    >>> start_good([0, 0, 1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    4
    >>> start_good([])
    -1
    >>> start_good([0, 0])
    -1
    >>> start_good([0, 0, 0])
    -1
    >>> start_good([0, 0, 0, 0, 1])
    -1
    >>> start_good([0, 0, 1, 0, 1, 2, 3])
    -1
    >>> start_good([0, 0, 1, 0, 1, 2, 3, 4])
    4
    >>> start_good([0, 0, 1, 0, 1, 2, 3, 4, 5])
    4
    >>> start_good([1, 2, 3, 4])
    0
    >>> start_good([1, 2, 3])
    -1
    >>> start_good([0, 0, 1, 0, 1, 2, 0, 4])
    -1
    """
    n_good = 0
    for i, el in enumerate(alist):
        if alist[i]:
            if n_good == good_ones:
                return i - good_ones
            else:
                n_good += 1
        else:
            n_good = 0
    if n_good == good_ones:
        return len(alist) - good_ones
    else:
        return -1


if __name__ == "__main__":
    import doctest
    doctest.testmod()
    print "Doctests done\n"

Bye,
bearophile



More information about the Python-list mailing list