mattia wrote: > The last question: how can I improve readability in this piece of code? > > def crossover(pop, prob=0.6): > """ > With a crossover probability cross over the parents to form new > offspring. If no crossover was performed, offspring is the exact copy > of parents. """ > cpop = [] > for i in range(0, len(pop), 2): > # crossover > if prob > random(): > crossover_point = randint(0, len(pop[i])-1) > nchromosome1 = pop[i][:crossover_point] + > pop[i+1][crossover_point:] nchromosome2 = > pop[i+1][:crossover_point] + pop[i][crossover_point:] > else: > nchromosome1 = pop[i][:] > nchromosome2 = pop[i+1][:]
> cpop += [nchromosome1] + [nchromosome2] I'd write that as cpop.append(nchromosome1) cpop.append(nchromosome2) thus avoiding the intermediate lists. > return cpop > > And with this one my example is complete! Just for fun here's an alternative version of your function def generate_crossover(pop, prob): for a, b in zip(*[iter(pop)]*2): if prob > random(): cut = randrange(len(a)) a, b = a[:cut] + b[cut:], b[:cut] + a[cut:] yield a yield b def crossover(pop, prob=0.6): return list(generate_crossover(pop, prob)) but as the original is a bit clearer I recommend that you stick with it. Peter -- http://mail.python.org/mailman/listinfo/python-list