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

Python 如何从列表中的列表中删除对象?,python,python-3.x,oop,object,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) sel

假设有三个列表,第三个是包含前两个的列表:

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)
x = Goblin()
我创建了Goblin类的一个实例:

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.append(x)
现在让我们假设地精英勇地死去,必须从战场上移除。如果我做了友好列表。移除(x),地精将被移除而不会出现问题

如果我使用Battle_Space.remove(x),它表示x不在列表中,即使x在属于Battle_Space列表的一个列表中


我想我真正想问的是:什么是实现战斗空间预期行为的正确方法。移除(x)?要删除层深的实例?

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

Battle_Space[0].remove(x)
要从出现的任何位置删除
x
,可以使用列表:

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

简单但可能不太干净的方法是
战斗空间[0]。删除(x)
。您必须确保第一个列表是友好列表

<>我的可读性建议是考虑在<<代码> BattleSpace < /Cord>对象中放置<代码>友好列表> />代码> <代码>您还可以在该对象中创建一个方法,以从任何子列表中删除目标:

class BattleSpace(object):
    def __init__(self):
        self.friendly_list = []
        self.enemy_list = []

    def remove(self, target):
        if target in self.friendly_list:
            self.friendly_list.remove(target)
        if target in self.enemy_list:
            self.enemy_list.remove(target)


battle_space = BattleSpace()
battle_space.friendly_list.append(x)
battle_space.remove(x)  # can also do battle_space.friendly_list.remove(x)

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

只需过滤掉那些达姆妖精,例如:

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
该代码将从你的银河系之战的所有军队中移除那个达姆复制的地精

我不太喜欢银河战争,地精能神奇地复制自己吗?:')

编辑

如果您想要一种更为面向对象的方法,您应该将上述代码转换为类似以下内容:

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

通过这种方式,您可以轻松地将您的作战空间扩展到来自不同星球的无数星系间军队

对于您的问题,有两种可能的解释:您想只删除某个特定“位置”的
x
,还是删除它可能出现的任何位置?您必须指定要从中删除的列表:
作战空间[0]。删除(x)
。我想删除战斗空间列表中可能出现的x。@Kos意味着一个
地精有可能同时出现在友军和敌军列表中?请尝试对变量和属性使用PEP-8命名约定。以大写字母开头的名称表示一个类,如果它是一个变量或属性,则会使其他程序员感到困惑。用小写字母命名变量和属性,必要时加下划线。绝对是更好的解决方案。编辑:在
Goblin
类中添加一个属性来指定它是否友好,这样你就可以确切地知道要从哪个列表中删除。我如何从战斗列表中删除x,而不知道它是否在友好列表或敌人列表中,但只要知道它在某个地方的战斗列表中?@Kos就可以检查两个列表,就像卡林所说的,或者在每个
地精
实例上都有一个属性
self.type='friendly'
'self.type='friendly'
,然后将该变量传递给Karin编写的
remove
函数。这是最干净的方法。@Karin我会删除你最后一行代码中的注释。像您所写的函数中的点,
remove()
,通常是执行任务的一种方式,而不允许外部人员直接访问类变量。这就是其他语言中的
private
关键字的全部内容。如果一个函数想要操纵
BattleSpace
所拥有的列表,那么它只能通过
BattleSpace
提供的方法来进行操作。小提示:虽然列表理解和筛选会给你正确的答案,但我宁愿不这样做,因为它们都会创建新的列表,而remove将从现有列表中删除该项。当然,这样做所节省的内存对于您的用例来说可能微不足道;)我认为Karin建议的OO方法是一种更好的方法。更具组织性,更具通用性,更符合OP的代码。@jphollowed好吧,我不同意你的观点,伊姆霍·卡林的方法将军队与作战空间类结合在一起,这不是一个好的做法。我对我的答案进行了编辑,以使其更准确flexible@Kos出于好奇,你为什么认为其他答案比这个好?他们用更少的代码做了我需要做的事情,并且以一种我可以理解更多的方式(我还是一个初学者),这就是我非常感谢你的非常简洁的答案;你一句话就达到了我想要的行为。我将学习更多关于列表理解的知识,这样我就可以在代码中准确地了解正在发生的事情。