2016-08-12 3 views
2

Скажет, есть три списка, а третий список, содержащий первые два:Как удалить объект из списка внутри списка?

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)? Чтобы удалить экземпляр с глубоким слоем?

+0

На ваш вопрос есть две возможные интерпретации: вы хотите удалить «x» в определенном «местоположении» только или везде, где это может появиться? – Julien

+0

Необходимо указать, какой список вы удаляете: 'Battle_Space [0] .remove (x)'. – Anonymous

+0

Я хочу удалить x везде, где он может появиться в списке Battle_Space. – Kos

ответ

4

Простой, но, возможно, не очень чистый способ: Battle_Space[0].remove(x). Вы должны убедиться, что первый список является дружественным списком.

Мое предложение для читаемости было бы рассмотреть вопрос о помещении friendly_list и enemy_list в объект BattleSpace, чтобы вы могли ссылаться на них по имени. Вы также можете создать метод в этом объекте, чтобы удалить цель из любого списка ребенка:

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) 

Edit: Просто прочитайте замечание OP о том, что желание убрать в любом месте в списке. Измененный код.

+2

Определенно лучшее решение. Изменить: также было бы полезно добавить атрибут в класс Goblin, чтобы указать, является ли он дружественным или нет, поэтому вы точно знаете, какой список удалить. – Anonymous

+0

Как удалить x из battle_list, не зная, находится ли он в friendly_list или enemy_list, но просто зная, что он где-то в battle_list? – Kos

+0

@ Kos. Проверяя оба списка, как сказал Карин, или имея атрибут на каждом экземпляре «Гоблин». 'self.type = 'friendly'' или' 'self.type =' enemy'', затем передать эту переменную функции' remove', написанной Karin. Это самый чистый путь. – Anonymous

1

Если вы знаете, индекс вложенного списка, вы можете индексировать из родительского списка и вызовите remove:

Battle_Space[0].remove(x) 

Чтобы удалить x из любой точки оказывается, вы можете использовать список понимание:

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

Большое спасибо за очень краткий ответ Моисей; вы достигли желаемого поведения в одной строке. Я узнаю больше о понимании списка, чтобы я мог включить в свой код, зная, что происходит. – Kos

+0

@kos Рад, что это сработало для вас –

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 

код удалит эти Даммы дублируются гоблином из всех армий вашего межгалактической битвы.

Я не большой поклонник галактических сражений, могут ли гоблины копировать себя магически?: ')

EDIT

Если вы хотите более объектно-ориентированного подхода, вы бы преобразовать код выше в чем-то больше, как это:

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 

Таким образом, вы могли бы расширить свой легко Battlespace к миллиону межгалактических армий с разных планет

+0

Я думаю, что подход ОО, предложенный Карин, - гораздо лучший способ пойти. Более организованный, более универсальный и более совместимый с кодом OP. – Anonymous

+0

@jphollowed Ну, я не согласен с тобой, ИМХО, подход Карина объединяет армии с классами BattleSpace, это не очень хорошая практика. Я отредактировал свой ответ, чтобы сделать его более гибким. – BPL

+0

@ Kos Из любопытства, почему вы думаете, что другие ответы лучше, чем этот? – BPL