2016-07-24 14 views
0

Wir alle wissen, dass wir eine große Anzahl von Datentypen in eine Python-Liste einfügen können. Für z. eine Liste derEntfernen von Objekten mit bestimmten Daten aus einer Liste

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

To ‚c‘ zu entfernen alles, was ich tun muß, ist

X.remove('c') 

Jetzt Was ich brauche, ist ein Objekt, das eine bestimmte Zeichenfolge zu entfernen.

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 Ich möchte:

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

Sie entfernen das 'Objekt' selbst, bilden Ihre Liste, die sich nicht ändert, da Ihre Liste Ihr Objekt nicht enthält. Um die erwartete Ausgabe zu erhalten, müssen Sie die Elemente basierend auf den Attributen Ihres Objekts entfernen. – Kasramvd

+0

@Kasramvd ist richtig. Kannst du die Rolle von 'Object.i' beschreiben? –

+0

Sorry, das war ein Fehler meinerseits. Ich habe den Code bearbeitet, ist es jetzt klar? Code wird nicht ausgeführt. Aber ich hoffe, du hast verstanden, was ich versuche zu tun – XChikuX

Antwort

1

Ich denke, was Sie wollen, ist dies:

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

Sie müssen in dieser letzten Anweisung drucken, damit es funktioniert. Danke, genau was ich wollte: D – XChikuX

0

Für die Liste

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

Wenn Sie wissen, dass das erste Element eines Tupels ist immer ein String ist, und Sie möchten die Zeichenfolge entfernen Wenn es einen eindeutigen Wert hat, verwenden Sie ein Listenverständnis:

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

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

print (X) 

Ausgänge der folgende:

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

Die folgende Funktion wird anstelle entfernen alle Elemente für sie Zustand ist True:

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

Hier, wie Sie es verwenden können:

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

Schöne Lamda-Funktion. Aber getattr() scheint mir sauberer zu sein. Trotzdem danke :) – XChikuX

Verwandte Themen