2016-07-24 1 views
0

Мы все прекрасно понимаем, что мы можем вставить огромный массив типов данных в список python. Напр. список символовУдалить объекты, содержащие определенные данные из списка

X=['a','b','c'] 

Чтобы удалить «с» все, что я должен сделать, это

X.remove('c') 

Что теперь мне нужно, чтобы удалить объект, содержащий определенную строку.

class strng: 
    ch = '' 
    i = 0 
X = [('a',0),('b',0),('c',0)]    #<---- Assume The class is stored like this although it will be actually stored as object references 
Object = strng() 
Object.ch = 'c' 
Object.i = 1 
X.remove('c')     #<-------- Basically I want to remove the Object containing ch = 'c' only. 
           #   variable i does not play any role in the removal 
print (X) 

Ans Я хочу:

[('a',0),('b',0)]     #<---- Again Assume that it can output like this 
+0

Вы удаляете сам «объект», формируете свой список, который, поскольку ваш список не содержит ваш объект, ничего не изменится. Для получения ожидаемого результата вам нужно удалить элементы на основе атрибутов вашего объекта. – Kasramvd

+0

@ Kasramvd является правильным. Можете ли вы описать роль 'Object.i'? –

+0

Извините, что это была ошибка с моей стороны. Я редактировал код, теперь ясно? Код фактически не запущен. Но я надеюсь, что вы поняли, что я пытаюсь сделать. – XChikuX

ответ

1

Я думаю, что вы хотите это:

>>> class MyObject: 
... def __init__(self, i, j): 
...  self.i = i 
...  self.j = j 
... def __repr__(self): 
...  return '{} - {}'.format(self.i, self.j) 
... 
>>> x = [MyObject(1, 'c'), MyObject(2, 'd'), MyObject(3, 'e')] 
>>> remove = 'c' 
>>> [z for z in x if getattr(z, 'j') != remove] 
[2 - d, 3 - e] 
+0

Вам нужно использовать печать в этом последнем утверждении, чтобы она работала. Спасибо, именно то, что я хотел: D – XChikuX

0

Для списка

X = [('a',0),('b',0),('c',0)] 

Если вы знаете, что первый элемент кортежа всегда является строкой, и вы хотите, чтобы удалить эту строку если он имеет отличное значение, то используйте понимание по спискам:

X = [('a',0),('b',0),('c',0)] 

X = [(i,j) for i, j in X if i != 'c'] 

print (X) 

Результаты следующие:

[('a', 0), ('b', 0)] 
1

Следующая функция удалит в месте все детали для них условия является True:

def remove(list,condtion): 
    ii = 0 
    while ii < len(list): 
     if condtion(list[ii]): 
      list.pop(ii) 
      continue   
     ii += 1 

Здесь вы можете использовать его:

class Thing: 
    def __init__(self,ch,ii): 
     self.ch = ch 
     self.ii = ii 
    def __repr__(self): 
     return '({0},{1})'.format(self.ch,self.ii) 

things = [ Thing('a',0), Thing('b',0) , Thing('a',1), Thing('b',1)]  
print('Before ==> {0}'.format(things))   # Before ==> [(a,0), (b,0), (a,1), (b,1)] 
remove(things , lambda item : item.ch == 'b') 
print('After ==> {0}'.format(things))   # After ==> [(a,0), (a,1)] 
+0

Nice lamda function. Но getattr() кажется мне более чистым. Спасибо хоть :) – XChikuX