Is there a better way of doing this?

mattia gervaz at gmail.com
Fri Mar 6 06:07:22 EST 2009


Il Fri, 06 Mar 2009 10:19:22 +0000, mattia ha scritto:

> Hi, I'm new to python, and as the title says, can I improve this snippet
> (readability, speed, tricks):
> 
> def get_fitness_and_population(fitness, population):
>     return [(fitness(x), x) for x in population]
> 
> def selection(fitness, population):
>     '''
>     Select the parent chromosomes from a population according to their
>     fitness (the better fitness, the bigger chance to be selected) '''
>     selected_population = []
>     fap = get_fitness_and_population(fitness, population) pop_len =
>     len(population)
>     # elitism (it prevents a loss of the best found solution) # take the
>     only 2 best solutions
>     elite_population = sorted(fap)
>     selected_population += [elite_population[pop_len-1][1]] +
> [elite_population[pop_len-2][1]]
>     # go on with the rest of the elements for i in range(pop_len-2):
>         # do something

Great, the for statement has not to deal with fap anymore, but with 
another sequence, like this:

def get_roulette_wheel(weight_value_pairs):
    roulette_wheel = []
    for weight, value in weight_value_pairs:
        roulette_wheel += [value]*weight
    return roulette_wheel

def selection(fitness, population):
    ...
    rw = get_roulette_wheel(fap)
    for i in range(pop_len-2):
        selected_population += [choice(rw)]
    return selected_population    

I think that using [choice(rw)]*len(fap) will produce the same sequence 
repeted len(fap) times...



More information about the Python-list mailing list