从列表中删除列表,具体取决于各个列表的总和

时间:2015-03-01 10:28:24

标签: python list

我想从列表中删除列表,具体取决于列表的总和。例如:

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的列表。我认为上面的代码应该可以工作,但事实并非如此。

2 个答案:

答案 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