2017-11-04 16 views
1

に異なるリストから項目を選択し組み合わせるは、私は次のプログラムを持って新しいもの

[[[0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1], [1], [0]], 
[[0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1], [3], [1]], 
[[0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1], [4], [2]], 
[[0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1], [3], [3]], 
[[0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1], [1], [0]], 
[[0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1], [3], [1]], 
[[0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1], [4], [2]], 
[[0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1], [3], [3]], 
[[0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0], [1], [0]], 
[[0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0], [3], [1]], 
[[0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0], [4], [2]], 
[[0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0], [3], [3]], 
[[1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0], [1], [0]], 
[[1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0], [3], [1]], 
[[1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0], [4], [2]], 
[[1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0], [3], [3]]] 

私の目標は、要素の遺伝子(バイナリーベクター)を組み合わせることです、 binary_listからrandom_poolリストの各項目の最後の2つの要素と一致するので、正しい結果は次のようになります。

[[[0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1], [1], [0]], 
[[0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1], [3], [1]] 
[[0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0], [4], [2]], 
[[1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0], [3], [3]]] 

ループに何か問題があることは知っていますが、すでに多くのことを試していましたが、結果が得られませんでした。誰かが私が何を間違っているか、それを修正するために熱いと言うことができますか?

ありがとうございました!

答えて

2

これは、予想される結果得られますあなたの関数のバージョンである:binary_list内のすべての要素に対してrandom_poolを通して、あなたの元のコードで

def GeneratePopulation(random_pool, binary_list): 
    individual = [] 
    population = [] 
    for ind in range(0,len(binary_list)): 
     fitness = random_pool[ind][2] 
     counter = random_pool[ind][3] 
     gene = binary_list[ind] 
     individual=[gene,fitness,counter] 
     population.append(individual) 
    return(population) 

ループ繰り返し処理のものを - 必要ではなかったと繰り返し成果を生み出しています。

変数fitnesscounter、およびindividualはここでは冗長ですが、作成しなくても同じ結果が得られることにご注意ください。あなたは他の何かのためにそれらを必要としますか?

+0

これは私が探していたものです。変数については、私はそれらの名前を付けていますので、プログラムのステップの中でどのものが何であるかを知っていますが、2番目の考えでは、今それらを削除するかもしれません。 – vferraz

+0

これはうまくいきました:)はい、このような冗長な変数は避けてください。他にもどこかで使用されているという誤った印象を作ります。その場合、単純にループを 'population.append([binary_list [ind]、random_pool [ind] [2]、random_pool [ind] [3]])'という行にパックすることができます。 – atru

+0

@skrx私の個人的な選択は、使用されている変数だけを保持し、何が何行になるのかをコメントすることです。しかし、それは個人的なものです。そこにポイントがあります。 – atru

2

さらに多くのpythonic解決策はzipリストになるので、random_poolbinary_listを同時に繰り返してインデックスを使う必要はありません。

また、この方法でプールを解凍することもできます:*_, fitness, counter = pool*_は、最初の項目を変数_にアンパックします。これは不要な値によく使用され、最後の2つは変数fitnesscounterに展開されます。 list comprehensionやジェネレータ式で

def generate_population(random_pool, binary_list): 
    population = [] 
    for pool, gene in zip(random_pool, binary_list): 
     *_, fitness, counter = pool # Unpack the pool. Ignore the first two items. 
     population.append([gene, fitness, counter]) 
    return population 

、あなたも、より多くの機能を減らすことができます。

def generate_population(random_pool, binary_list): 
    return [[gene, fitness, counter] 
      for (*_, fitness, counter), gene in zip(random_pool, binary_list)] 
+0

ようこそ。ところで、Ned Batchelderのプレゼンテーション[「ネイティブのようなループ:while、for、iterators、generators」](https://www.youtube.com/watch?v=EnSu9hHGq5o)を見てみることをおすすめします。 – skrx

関連する問題