[Tutor] make code less ugly/more pythonic?
Daniel Ehrenberg
littledanehren at yahoo.com
Tue Dec 9 22:22:09 EST 2003
ashleigh smythe wrote:
> Greetings! I've written a little script to process
> a text file. It
> does exactly what I want it to do but as I'm a
> newbie I'm sure it's very
> ugly and brute force - I wondered if anyone had a
> moment to please take
> a look and tell me how to improve it? For instance
> I have a function
> that calls a function that calls a function! Is
> that awkard and
> unpythonic? Should the whole thing be in a class -
> how would I do that?
>
> The program simply parses a file that has 10,000
> iterations of the
> following:
>
>
> Strict consensus of 1 tree:
>
> Statistics derived from consensus tree:
>
> Component information (consensus fork) = 185
> (normalized = 0.964)
> Nelson-Platnick term information = 3855
> Nelson-Platnick total information = 4040
> Mickevich's consensus information = 0.183
> Colless weighted consensus fork (proportion
> max. information) =
> 0.216
> Schuh-Farris levels sum = 0 (normalized =
> 0.000)
> Rohlf's CI(1) = 0.989
> Rohlf's -ln CI(2) = 948.111 (CI(2) = 0.00)
>
>
> I want to extract that Component information
> (consensus fork) value (185
> in this instance) from each of the 10,000
> "paragraphs" of data in the
> file and get an average of that value.
>
>
> Below is the code I hacked together- please don't
> laugh!!! :-)
>
> Thanks for any imput,
>
> Ashleigh
>
> import re
> import sys
> import string
>
> def make_int(mylist): #turns the
> list of consensus
> an_int_list=[int(n) for n in mylist] #fork
> values from strings to
> return an_int_list #integers
> so I can average
> #them.
> def add_up(mylist): #calls
> function to turn
> int_list=make_int(mylist) #strings
> into
> asum=0 #integers.
> for x in int_list: #sums up
> all the values
> asum +=x
> return asum
>
> def average(mylist): #takes the
> sum of consensus
> sum=add_up(mylist) #fork
> values and finds their
> length=len(mylist) #average.
> average_confork=sum/length
> return average_confork
>
> mainlist=[]
> #initialize the list of
> #consensus
> fork values.
> def search(file_to_search):
> infile=open(file_to_search, 'r')
> for line in infile:
> if re.search('Component', line): #searches
> the input file for
> confork=line[45:49] #line
> containing cons. fork,
> mainlist.append(confork) #removes
> the value and puts
> return mainlist #it into a
> list.
>
> def aveconfork(file_to_search): #this
> executes the whole thing
> thelist=search(file_to_search) #so I
> start the program with
> finalaverage=average(mainlist)
> #aveconfork.aveconfork
> return finalaverage
> #('file_to_search')
Your program is good. It does what it is supposed to
do. I do have a few changes to it, though. Here's my
edited version:
def avg_str_list(L):
newlist = [int(x) for x in L]
return sum(newlist) #sum adds up everything in
list
def find_comp_if_there(string):
if string.startswith('Component'):
return string[45:49]
def go_through_file(filename):
thisfile = file(filename) #mode 'r' implied
mainlist = []
for line in thisfile:
cur_comp = find_comp_if_there(line)
if cur_comp: mainlist.append(cur_comp)
return mainlist
This uses the same underlying algorithm as your
program does.
Daniel Ehrenberg
__________________________________
Do you Yahoo!?
New Yahoo! Photos - easier uploading and sharing.
http://photos.yahoo.com/
More information about the Tutor
mailing list