我想从列表中删除列表,具体取决于列表的总和。例如:
from __future__ import print_function, division
import random
class Population:
def __init__(self):
self.population = []
def random(self):
for x in range(0,21):
individual=random.sample(range(100),6)
self.population.append(individual)
print(self.population)
def selection(self):
for individual in self.population:
if sum(individual)<250:
self.population.remove(individual)
print(self.population)
我认为我的代码会生成一个包含20个随机列表的列表。然后我想在这个列表上选择并拒绝总和小于250的列表。我认为上面的代码应该可以工作,但事实并非如此。
答案 0 :(得分:0)
你不应该改变你正在迭代的列表,复制或反向使用。如果在迭代期间更改列表的大小,则最终会丢失元素:
for individual in reversed(self.population):
if sum(individual) < 250:
self.population.remove(individual)
复制:
for individual in self.population[:]: # copy [:]
if sum(individual) < 250:
self.population.remove(individual)
同样range(0,21)
创建了21个不是20个列表,您需要range(20)
答案 1 :(得分:0)
从以下位置重写您的功能:
def selection(self):
for individual in self.population:
if sum(individual)<250:
self.population.remove(individual)
print(self.population)
使用list-comp和就地覆盖原始仅保留有效项目:
def selection(self):
self.population[:] = [item for item in self.population if sum(item) >= 250]
for item in self.population:
print item