あなたは「同じカウンタを持つアイテムをインデックスに登録し、リストから削除しようとしています」と言っています。それは可能ですが、が巨大でない限り、保存したい染色体を含む新しいリストを作成するほうが簡単です(そして速い)。
最初にselected_chromosomes
をスキャンして、カウンターナンバーを1つのセットに抽出し、すばやく検索することができます。リストが巨大である、またはあなたが元のリストを維持するために他のいくつかの理由がある場合
population=[
[[0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1], [4], [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], [1], [3]],
]
selected_chromosomes=[
[[0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0], [5], [2]],
[[0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1], [3], [0]],
]
def population_adjustment(population, selected_chromosomes):
# Create a set of the counter numbers to remove
drop = {u[-1][0] for u in selected_chromosomes}
# Copy the wanted chromosomes to a new list
return [u for u in population if u[-1][0] not in drop]
new_pop = population_adjustment(population, selected_chromosomes)
for row in new_pop:
print(row)
出力
[[0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1], [3], [1]]
[[1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0], [1], [3]]
(例えば、これまで複数の参照でもありますさまざまな場所)、不要なリストを削除する方法は次のとおりです。しかし、我々は注意する必要があります。反復処理中のリストから項目を削除すると、残りのリスト項目のインデックスが取り除かれるため、hereのように危険です。あなたが座っている木の枝を切り取ったような感じです。あなたが間違った場所でカットすると、悪いことが起こります。 ;)最も簡単な方法は、リストを逆に反復することです。
population=[
[[0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1], [4], [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], [1], [3]],
]
selected_chromosomes=[
[[0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0], [5], [2]],
[[0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1], [3], [0]],
]
def population_adjustment(population, selected_chromosomes):
# Create a set of the counter numbers to remove
drop = {u[-1][0] for u in selected_chromosomes}
# Iterate backwards over population so we can safely delete sublists
for i in range(len(population)-1, -1, -1):
k = population[i][-1][0]
if k in drop:
del population[i]
# Since we mutate `population` we should return `None`, as is conventional in Python.
# This return statement isn't necessary, since `None` is the default return value,
# but it's nice to be explicit
return None
population_adjustment(population, selected_chromosomes)
for row in population:
print(row)
このコードは以前のバージョンと同じ出力を生成するので、私はそれを繰り返さないでください。
いくつかのアドバイス:理解しやすくするためにこれらのリストを短くしてください(手動で計算しようとしている出力を表示してください) –
参考までに、 'population '。 – timgeb
@timgeb、私の間違い、その固定 – vferraz