如何从列表中的列表中删除对象?

时间:2016-08-12 16:08:16

标签: python python-3.x oop object

我们说有三个列表,第三个是包含前两个列表的列表:

Friendly_List = list()
Enemy_List = list()
Battle_Space = list([Friendly_List, Enemy_List])

一个地精班:

class Goblin(object):
    def __init__(self):
        self.Name = "Goblin"
        self.HP = random.randint(15,20)
        self.Damage = random.randint(5,10)

我创建了一个Goblin类的实例:

x = Goblin()

然后将其放入Friendly_List:

Friendly_List.append(x)

现在让我们说妖精英勇地死去,必须从战场上移除。如果我执行Friendly_List.remove(x),则会毫无问题地移除地精。

如果我执行Battle_Space.remove(x),则表示x不在列表中 - 即使x位于Battle_Space列表中的一个列表中。

我想我真正要问的是:实现Battle_Space.remove(x)所需行为的正确方法是什么?要删除深层图层的实例吗?

3 个答案:

答案 0 :(得分:4)

简单但可能不那么干净的方式是a。您必须确保第一个列表是友好列表。

我对可读性的建议是考虑将Battle_Space[0].remove(x)friendly_list放在enemy_list对象中,以便您可以按名称引用它们。您还可以在该对象中创建一个方法,以从任何子列表中删除目标:

BattleSpace

编辑:请阅读OP的评论,希望删除列表中的任何位置。修改后的代码。

答案 1 :(得分:1)

如果你知道嵌套列表的索引,你可以从父列表索引并调用remove

Battle_Space[0].remove(x)

要从显示的任何位置删除x,您可以使用列表理解:

Battle_Space = [[j for j in innerlist if j!=x] for innerlist in Battle_Space]

答案 2 :(得分:1)

过滤掉那些该死的地精,例如:

import random


class Goblin(object):

    def __init__(self):
        self.Name = "Goblin"
        self.HP = random.randint(15, 20)
        self.Damage = random.randint(5, 10)

x = Goblin()
Friendly_List = list()
Enemy_List = list()
Battle_Space = list([Friendly_List, Enemy_List])
Friendly_List.append(x)
Friendly_List.append(x)
Friendly_List.append(x)
Enemy_List.append(x)

print Battle_Space
for index, army in enumerate(Battle_Space):
    Battle_Space[index] = filter(lambda entity: entity != x, army)
print Battle_Space

该代码将从你星际战争的所有军队中删除那个该死的重复的妖精。

我不是银河战斗的狂热粉丝,地精可以神奇地复制自己吗? :')

修改

如果你想要一个更多的OOP方法,你可以用上面这样的代码转换上面的代码:

import random


class Goblin(object):

    def __init__(self):
        self.Name = "Goblin"
        self.HP = random.randint(15, 20)
        self.Damage = random.randint(5, 10)


class Army(object):

    def __init__(self):
        self.entities = []

    def remove(self, target):
        if target in self.entities:
            self.entities.remove(target)

    def filter(self, target):
        self.entities = filter(
            lambda entity: self.entities != entity, self.entities)


class BattleSpace(object):

    def __init__(self):
        self.armies = []

    def remove(self, target):
        for index, army in enumerate(self.armies):
            army.remove(target)

    def filter(self, target):
        for index, army in enumerate(self.armies):
            army.filter(target)


x = Goblin()
battle_space = BattleSpace()
Friendly_List = Army()
Enemy_List = Army()
battle_space.armies = [Friendly_List, Enemy_List]
Enemy_List.entities.append(x)

print "Initial setup"
print Enemy_List.entities
print Friendly_List.entities

print "After removing"
battle_space.remove(x)
print Enemy_List.entities
print Friendly_List.entities

这样你可以轻松地将你的战斗空间扩展到来自不同星球的数十亿的星系间军队