[Tutor] extracting numbers from a list
kumar s
ps_python at yahoo.com
Wed Oct 18 20:52:11 CEST 2006
Thank you Danny. I am going over your email and trying
to understand (i am a biologist with bioinformatics
training).
I am not sure if I got your opinion about the way I
solved. do you mean that there is something wrong with
the way i solved it.
I am not sure If I explained the problem correctly in
terms of exons, transcripts. If not I would be happy
to send you a pdf file with a figure.
Thanks again.
--- Danny Yoo <dyoo at hkn.eecs.berkeley.edu> wrote:
>
>
> On Mon, 16 Oct 2006, kumar s wrote:
>
> > I have a simple question to ask tutors:
> >
> > list A :
> >
> > a = [10,15,18,20,25,30,40]
>
>
> Hi Kumar,
>
> If you're concerned about correctness, I'd recommend
> that you try thinking
> about the problem inductively. An inductive
> definition for what you're
> asking is straightforward to state in about three or
> four lines of code.
> I'll try to go through it slowly so you see what the
> reasoning behind it
> is. The code sketch above uses a technique that you
> should already know
> called "mathematical induction."
>
>
> http://en.wikipedia.org/wiki/Mathematical_induction
>
>
> Let's say we're designing a function called
> getSpans(). Here are some
> sample behavior we'd like from it:
>
> getSpans([10, 15]) = [(10, 15)]
> getSpans([10, 15, 18]) = [(10, 15), (16, 18)]
> getSpans([10, 15, 18, 20]) = [(10, 15), (16,
> 18), (19, 20)]
>
> Would you agree that this is reasonable output for a
> function like this?
> getSpans() takes a list of numbers, and returns a
> list of pairs of
> numbers.
>
>
> There is one "base" case to this problem. The
> smallest list we'd like to
> consider is a list of two elements. If we see that,
> then we're happy,
> because the answer is really simple:
>
> getSpans([a, b]) = [(a, b)]
>
>
> Otherwise, let's imagine a list that's a bit longer,
> with three elements.
> Concretely, we know that this is going to look like:
>
> getSpans([a, b, c]) = [(a, b), (b+1, c)]
>
> But another way to say this, though is that:
>
> getSpans([a, b, c]) = [(a, b)] + getSpans([b+1,
> c])
>
> That is, we try to restate the problem in terms of
> smaller subproblems.
>
>
>
> Let's look at what the case for four elements might
> look like:
>
> getSpans([a, b, c, d]) = [(a, b), (b+1, c),
> (c+1, d)]
>
> Concretely, we know that that's the list of spans
> we'd like to see. But
> if we think about it, we might also restate this as:
>
> getSpans([a, b, c, d]) = [a, b] +
> getSpans([b+1, c, d])
>
> because getSpans([b+1, c, d]) is going to give us:
>
> [(b+1, c), (c+1, d)]
>
> All we need to do is add on [(a, b)] to that to get
> the complete answer to
> getSpans([a, b, c, d]).
>
>
> Generally, for any particular list L that's longer
> than two elements:
>
> getExons(L) = [L[0:2]] + getExons([L[1] + 1] +
> L[2:])
>
> When we work inductively, all we really need to
> think about is "base case"
> and "inductive case": the solution will often just
> fall through from
> stating those two cases. An inductively-designed
> function is going to
> look something like:
>
> def solve(input):
> if input looks like a base-case:
> handle that directly in a base-case way
> else:
> break up the problem into smaller
> pieces
> that we assume can be solve()d by
> induction
>
> The inductive definition above is slightly
> inefficient because we're doing
> physical list slicing. Rewriting it to use loops
> and list indicies
> instead of slicing is a little harder, but not much
> harder.
>
> Another example: how do we add up a list of numbers?
> If there's just one
> number, that must be the sum. Otherwise, we can add
> up the first number
> to the sum of the rest of the numbers.
>
> #################################
> def mysum(L):
> if len(L) == 1:
> return L[0]
> else:
> return L[0] + mysum(L[1:])
> #################################
>
> It's a funky way of doing this, but this is a real
> definition that works
> (modulo limits in Python's recursion
> implementation). It's inefficient,
> but it's easy to state and reason about. I'm
> assuming you're more
> interested in correctness than efficiency at the
> moment. Get it correct
> first, then if you really need to, work to get it
> fast.
>
__________________________________________________
Do You Yahoo!?
Tired of spam? Yahoo! Mail has the best spam protection around
http://mail.yahoo.com
More information about the Tutor
mailing list